Я нашел похожие вопросы от людей о свойствах объектов в коллекции, но мой вопрос касается свойства самой коллекции. В приведенном ниже примере свойство Something
объекта Collection
не возвращается после сериализации.
Как я могу заставить DataContractSerializer
сериализовать свойство Something
коллекции? Я знаю об обходном пути создания свойства вне объекта коллекции, но это сводит на нет причину даже использования пользовательских коллекций (возможность добавлять к ней свойства в будущем).
Это происходит и с NetDataContractSerializer
и XmlSerializer
.
Объекты
[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";
}
Помощники сериализации
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();
}
}
Пример программы
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");
}
Вывод
3
null
CollectionDataContract
предоставляет Взаимозаменяемые коллекции. Например, у массива есть свойствоLength
, а у списка — свойствоCount
. Если бы они были сохранены, обеспечить взаимозаменяемость было бы невозможно. - person Alexander Petrov   schedule 13.11.2019CollectionDataContractAttribute
и пользовательские коллекции бессмысленными, поскольку у них не может быть ничего, что отличало бы их отList<T>
? - person Chris Benard   schedule 13.11.2019[DataContract]
означает, что вы получаете свойства коллекции; применение[CollectionDataContract]
(или ничего не делать) означает, что вы получаете элементы коллекции; но нет возможности получить оба. Тема полностью отвечает на ваш вопрос? Или вам нужен обходной путь? - person dbc   schedule 14.11.2019