I've found similar questions from people about properties of objects within a collection, but my question is about a property of the collection itself. In the example below, the Something
property of the Collection
doesn't make the trip back from serialization.
How can I make DataContractSerializer
serialize the Something
property of the collection? I am aware of the workaround of making a property outside the collection object, but this negates the reason for even using custom collections (the ability to add properties to it in the future).
This happens with NetDataContractSerializer
and XmlSerializer
as well.
Objects
[DataContract]
public class TempClass
{
[DataMember]
public TempStuffCollection Collection { get; set; }
}
[CollectionDataContract]
public class TempStuffCollection : List<TempStuff>
{
[DataMember]
public string Something { get; set; }
}
[DataContract]
public class TempStuff
{
[DataMember]
public string Foo { get; set; } = "Bar";
}
Serialization Helpers
public TempClass Deserialize(byte[] serializedBytes)
{
using (Stream memoryStream = new MemoryStream(serializedBytes))
{
DataContractSerializer deserializer = new DataContractSerializer(typeof(TempClass));
TempClass storeMessage = (TempClass)deserializer.ReadObject(memoryStream);
return storeMessage;
}
}
public byte[] Serialize(TempClass storeMessage)
{
using (MemoryStream memoryStream = new MemoryStream())
{
DataContractSerializer serializer = new DataContractSerializer(typeof(TempClass));
serializer.WriteObject(memoryStream, storeMessage);
return memoryStream.ToArray();
}
}
Example Program
void Main()
{
var o = new TempClass
{
Collection = new TempStuffCollection
{
new TempStuff(),
new TempStuff(),
new TempStuff(),
}
};
o.Collection.Something = "this should still be here";
var serialized = Serialize(o);
var deserialized = Deserialize(serialized);
// Outputs: 3
Console.WriteLine(deserialized.Collection.Count);
// Outputs: null
Console.WriteLine(deserialized.Collection.Something ?? "null");
}
Output
3
null