2

我从人们那里发现了关于集合中对象属性的类似问题,但我的问题是关于集合本身的属性。在下面的示例中, 的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
4

0 回答 0