C#使用多个列表/集合中的对象序列化数据结构

时间:2010-07-20 12:08:49

标签: c# serialization collections list

在C#中,我希望序列化一个数据结构,其中对象可以属于多个集合。

例如,我有一个Person类。我还有一个Family类和School类,每个类都包含一个MemberList。 Person类的实例可以出现在Family的MemberList和School中。

我希望序列化整个数据结构,但我担心Person类的实例最终将被存储为两个单独的实例,并且在反序列化时,我将最终得到两个实例而不是一个实例。串行器是否足够聪明地存储数据以便不会发生这种情况?有没有办法阻止这种情况发生呢?

任何帮助或建议表示赞赏。

2 个答案:

答案 0 :(得分:1)

据我所知,它将序列化整个对象图 - 因此对象实例将被复制。自定义序列化是唯一的选择,可以手动或通过覆盖对象的默认序列化 - 两者都涉及。

我不会太担心它,直到它成为一个问题。第一步可以将整个图表序列化。

答案 1 :(得分:0)

您可以使用DataContractSerializer(由WCF使用)并使用DataContract属性和'IsReference'属性设置为true来装饰每个类(Family和School),如下所示:

[DataContract(IsReference=true)]
public class Family
{
    // ...
}

这将告诉DataContractSerializer在反序列化时重新创建对象图时保持引用不变。

您可以使用DataContractSerializer将对象'objectInstance'序列化为流,如下所示:

using (var stream = new MemoryStream())
{ 
    var serializer = new DataContractSerializer(objectInstance.GetType());
    serializer.WriteObject(stream, objectInstance);

    // The object has now been serialized to the stream
    // Do something with the stream here.
}

请注意,您实际上不必使用WCF,您只需使用DataContractSerializer来序列化/反序列化对象图。

您可以在MSDN here上详细了解此属性。

另外,here is a basic example如何使用'IsReference'属性。