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

C#使用多个列表/集合中的对象序列化数据结构,c#,serialization,collections,list,C#,Serialization,Collections,List,在C#中,我希望序列化一个数据结构,其中对象可以属于多个集合 例如,我有一个Person类。我还有一个家庭班和学校班,每个班都有一个成员名单。Person类的实例可以出现在家庭成员列表和学校成员列表中 我希望序列化整个数据结构,但担心Person类的实例最终将存储为两个单独的实例,反序列化后,我将使用两个实例而不是一个实例。serialiser是否足够聪明来存储数据,这样就不会发生这种情况?如果是这样,有没有办法阻止这种情况发生 非常感谢您的帮助或建议。据我所知,它将序列化整个对象图-因此对象实

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

例如,我有一个Person类。我还有一个家庭班和学校班,每个班都有一个成员名单。Person类的实例可以出现在家庭成员列表和学校成员列表中

我希望序列化整个数据结构,但担心Person类的实例最终将存储为两个单独的实例,反序列化后,我将使用两个实例而不是一个实例。serialiser是否足够聪明来存储数据,这样就不会发生这种情况?如果是这样,有没有办法阻止这种情况发生


非常感谢您的帮助或建议。

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


我不会太担心它,除非它成为一个问题。首先,可以序列化整个图形。

您可以使用DataContractSerializer(由WCF使用)并使用DataContract属性和“IsReference”属性设置为true来装饰每个类(家庭和学校),如下所示:

[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上阅读有关此属性的更多信息


还有,如何使用“IsReference”属性。

我想哪一个最有效、最容易实现。我准备用XML来启动,因为调试很容易,但是如果这有局限性,那么我会非常感谢,第二个链接太棒了!很高兴它有帮助!请注意,DataContractSerializer实际上会序列化为XML(它打算包含在SOAP消息中),因此序列化格式不会像其他序列化程序那样小。但是,您可以很容易地使用GZIP压缩(System.IO.compression.GZipStream)在存储序列化格式之前将其最小化。