从 BinaryFormatter 序列化切换而没有太大变化:大数据和循环引用

Posted

技术标签:

【中文标题】从 BinaryFormatter 序列化切换而没有太大变化:大数据和循环引用【英文标题】:Switch from BinaryFormatter serialization without changing much: big data and circular references 【发布时间】:2016-03-17 11:29:35 【问题描述】:

在我们维护多年的应用程序中,我们使用 BinaryFormatter 对包含大量集合和循环引用的大数据对象进行序列化。序列化几乎需要永远(约 20 秒)并占用大量 CPU 资源。我想从这种类型的序列化切换到更好更轻便的序列化,但由于没有太多时间,因此无需过多更改代码。

我尝试了许多解决方案,但其中一些需要:

类装饰或代码更改过多(例如ProtoBuf); 不允许循环引用(例如MsgPack);

有没有一种方法可以顺畅地切换到另一个更好的序列化器而不痛苦并改进序列化过程?

【问题讨论】:

【参考方案1】:

在做了一些研究并花了一天时间实施可用的解决方案之后 - 我会选择 Json.NET。

从 BinaryFormatter 切换我不需要做太多改变,甚至对象的序列化程序属性也没有改变。它运行得更快(在相同的对象大小下大约 2 秒),并且一切似乎都正常工作。

为了传递循环引用和其他错误,我必须配置序列化程序:

JsonSerializer serializer = new JsonSerializer();
serializer.Converters.Add(new javascriptDateTimeConverter());
serializer.NullValueHandling = NullValueHandling.Ignore;
serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
serializer.PreserveReferencesHandling = PreserveReferencesHandling.Objects;

using (StreamWriter sw = new StreamWriter(fileName))

    using (JsonWriter writer = new JsonTextWriter(sw))
    
        serializer.Serialize(writer, dbObject);
    

【讨论】:

以上是关于从 BinaryFormatter 序列化切换而没有太大变化:大数据和循环引用的主要内容,如果未能解决你的问题,请参考以下文章

XmlSerializer, DataContractSerializer 和 BinaryFormatter区别与用法分析

用 protobuf 替换 binaryformatter

二进制序列化和反序列化--BinaryFormatter 类

在c#中反序列化时,BinaryFormatter找不到'汇编'

如何序列化 CustomLineCap 类的实例

使用 protobuf-net 反序列化字典