从BinaryFormatter序列化切换而不会改变太多:大数据和循环引用

时间:2016-03-17 11:29:35

标签: c# serialization protobuf-net binaryformatter msgpack

在我们维护多年的应用程序中,我们使用包含大量集合和循环引用的大数据对象的BinaryFormatter序列化。序列化几乎永远(约20秒)并占用大量CPU。我想从这种类型的序列化切换到更好和更轻的状态但不会更改代码,因为没有太多时间给出。

我尝试了很多解决方案,但有些解决方案需要:

  • 课堂装饰或代码更改太多(例如ProtoBuf);
  • 不允许循环引用(例如MsgPack);

有没有办法顺利切换到另一个更好的序列化程序,没有痛苦,并改善序列化过程?

1 个答案:

答案 0 :(得分:-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);
    }
}