Zoals gezien in mijn eerdere post, die enigszins idioot was, maak ik gebruik van de DataContractSerializer voor het serializen van objecten naar xml die geen parameterless constructors kennen. Zoals in de documentatie van DataContractSerializer staat geef je bij de klassen aan dat je ze wilt serializen, dit doe ik in verband met compability met een binary serializer met het [Serializable] attribuut. Wanneer ik een object met meerdere objecten in zich wil gaan serializen, krijg ik de volgende error:
Ik construeer de DataContractSerializer als volgt:
disclaimer: ranzige code
De global method is dit:
Zoals je kunt zien ben ik het pad op gegaan van de laatste suggestie die de exception geeft:
Voor de volledigheid, ik vermoed dat het zit in mijn interpretatie van de constructor overload:
code:
1
2
3
| System.Runtime.Serialization.SerializationException: Type 'System.Collections.Generic.List`1[[<namespace-censuur>.Road, <censuur>, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' with data contract name 'ArrayOfRoad:http://schemas.datacontract.org/2004/07/<namespace-censuur>' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer. at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) |
Ik construeer de DataContractSerializer als volgt:
disclaimer: ranzige code
C#:
1
2
3
4
5
6
7
| List<Type> types = new List<Type>(); foreach (Type type in Global.GetSerializableTypes()) { types.Add(type); } Serializer.dcformatter = new DataContractSerializer(typeof(object), types); |
De global method is dit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
| //get classes with serializable attribute: http://stackoverflow.com/questions/607178/c-sharp-how-enumerate-all-classes-with-custom-class-attribute public static IEnumerable<Type> GetSerializableTypes() { foreach (Type type in Assembly.GetExecutingAssembly().GetTypes()) { if (type.GetCustomAttributes(typeof(SerializableAttribute), true).Length > 0) { yield return type; } } } |
Zoals je kunt zien ben ik het pad op gegaan van de laatste suggestie die de exception geeft:
Ik geef hem dus netjes de lijst mee met types die ik wil dat hij kan serializen, maar hij slikt het toch niet. De lijst die ik meegeef bij construction bevat de juiste types. Wat zie ik ditmaal gruwelijk over het hoofd? Ik weet hoe ik moet debuggen, maar met deze error kan ik gewoon niet gek veel.or by adding them to the list of known types passed to DataContractSerializer.
Voor de volledigheid, ik vermoed dat het zit in mijn interpretatie van de constructor overload:
Ik geef hem als eerste parameter typeof(object) mee, maar dat is niet wat hij bij het serializen als "root" meekrijgt....Initializes a new instance of the DataContractSerializer class to serialize or deserialize an object of the specified type, and a collection of known types that may be present in the object graph.
[ Voor 6% gewijzigd door afraca op 24-01-2012 16:22 ]
IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB