2

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

的输出BinaryFormatter会稍微小一些,但性能并不是真的更好

现在更小的表示是可能的(例如,XmlSerializerand DataContractSerializer、Json、Protocol Buffers、Thrift 等的输出),这也恰好可以更快地序列化和反序列化。

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

对象是否有任何其他性能改进和潜在的尺寸减小(除了 gzipping 等)Serializable

4

2 回答 2

0

在查看了 Lars Kemmann 的建议后,我的结论是:没有其他方法可以替代NetDataContractSerializer/BinaryFormatter以相同的方式序列化和反序列化。

我玩过Json.NET,它有点工作,但通常情况下,魔鬼在细节中(另见我对拉斯的回答的评论):

用现实生活中的对象进行测试,结果发现我的反序列化对象并非 100% 等同于原始对象,源于未序列化的超类中的字段。至少在粗略检查后看起来是这样。

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

  1. 必须在序列化之前手动注册每个(非 protobuf 注释的)类型
  2. 反序列化时必须指定确切的类型
  3. 它抱怨没有无参数构造函数的类
于 2014-08-15T04:54:57.253 回答
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 来进行类型实例化。我正在使用本文JsonConverter中描述的自定义。

于 2014-08-13T04:50:47.203 回答