更快地序列化`Serializable`对象

时间:2014-08-13 01:17:35

标签: .net serializable binaryformatter netdatacontractserializer

我们的客户端/服务器应用使用NetDataContractSerializer序列化任意Serializable个对象。

BinaryFormatter的输出会稍微小些,性能however实际上不是better

现在可以使用更小的表示形式(例如XmlSerializerDataContractSerializer,Json,Protocol Buffers,Thrift等的输出),这也恰好可以更快地序列化和反序列化。

但是,为了使用那些我必须访问Serializable类中的每一个并添加属性并可能更改字段的访问级别等。这些类不仅分布在许多不同的内部项目,但我们的客户有自己的dll Serializable类,必须修改。换句话说,是一项重大事业。

Serializable个对象可能有其他性能改进,可能的缩小尺寸(除了gzipping等)吗?

2 个答案:

答案 0 :(得分:0)

其中许多序列化程序不需要自定义属性 - 实际上有些是专门用于识别和使用SerializableAttribute的。例如,见:

Json.NET示例:

var settings = new JsonSerializerSettings
{ 
    TypeNameHandling = TypeNameHandling.All,
    PreserveReferencesHandling = PreserveReferencesHandling.Objects,
};
string serialized = JsonConvert.SerializeObject(obj, settings);
var deserialized = JsonConvert.DeserializeObject(serialized, settings);

更新:您不需要分叉Json.NET来进行类型实例化。我正在使用this article中描述的自定义JsonConverter

答案 1 :(得分:0)

在查看Lars Kemmann的建议后得出的结论: NetDataContractSerializer / BinaryFormatter除了以相同方式序列化和反序列化之外别无选择。 < / p>

我和Json.NET一起玩,它有点有用,但通常情况下,魔鬼在细节中(另请参阅我对Lars&#39;回答的评论):

使用现实生活中的对象进行测试结果表明,我的反序列化对象与原始对象不完全相同,源于超级类中未被序列化的字段。至少这是粗略检查后的情况。

Protobuf-net也不是一个选项,因为你

  1. 必须在序列化之前手动注册每个(非protobuf-annotated)类型
  2. 必须在反序列化时指定确切的类型
  3. 它抱怨没有无参数构造函数的课程