【问题标题】:C# serialising data structure with objects in multiple lists/collectionsC# 用多个列表/集合中的对象序列化数据结构
【发布时间】:2010-07-20 12:08:49
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我猜哪个最适合并且最容易实现。我打算从 XML 开始,因为它很容易调试,但如果这有限制,那么我会考虑其他的东西

标签: c# serialization collections list


【解决方案1】:

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

我不会太担心它,直到它成为一个问题。首先通过序列化整个图形就可以了。

【讨论】:

    【解决方案2】:

    您可以使用 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 here 上阅读有关此属性的更多信息。

    另外,here is a basic example 了解如何使用“IsReference”属性。

    【讨论】:

    • 非常感谢,第二个链接太棒了!
    • 很高兴它有帮助!请注意,DataContractSerializer 本质上将序列化为 XML(它旨在包含在 SOAP 消息中),因此序列化格式不会像其他序列化器一样小。但是,您可以轻松地使用 GZIP 压缩 (System.IO.Compression.GZipStream) 在存储序列化格式之前将其最小化。
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2016-05-02
    • 2020-02-24
    • 2010-09-27
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多