【问题标题】:Comparison of serializing methods [duplicate]序列化方法的比较[重复]
【发布时间】:2012-01-27 15:10:51
【问题描述】:

可能重复:
Fastest serializer and deserializer with lowest memory footprint in C#?

我正在使用BinaryFormatter 类来序列化结构或类。 (序列化后,我会在保存之前对序列化的文件进行加密。(当然在反序列化之前解密))

但我听说 .Net Framework 中还存在其他一些序列化类。像 XmlSerializer、JavaScriptSerializer、DataContractSerializer 和 protobuf-net。

我想知道,哪一个最适合我?

序列化/反序列化所需的 RAM 空间更少,这对我来说是最重要的。速度也很重要。

【问题讨论】:

  • 这样的问题(征求意见)不适合 StackExchange 格式。请询问具体编程问题(如果你不能发布代码,它可能不应该在这里)。
  • @MarcGravell 请发布这些建议作为答案。并请解释更多关于分组编码和加密流的信息。非常感谢!

标签: c# .net vb.net serialization


【解决方案1】:

如果您的目标是减少内存需求,则不要序列化然后加密:而是直接序列化为加密StreamStream API 设计为链式(装饰器模式)以执行多个转换而无需过多缓冲。同样:从解密流中反序列化;不要解密然后反序列化。通过这种方式,数据可以根据需要即时加密/解密;除了减少内存之外,它也有利于安全 - 因为这也意味着整个数据永远不会以解密形式作为单个缓冲区存在。有关完整示例,请参阅 MSDN 上的 CryptoStream

一些附加说明;如果您确实碰巧使用了 protobuf-net,则可以通过使用“分组”编码来减少任何内存缓冲;你看:子消息(包括列表)的默认值是“长度前缀” - 它通常这样做的方式是通过在内存中缓冲数据来计算长度。但是,protobuf 还支持使用开始/结束标记的格式,它不需要知道长度,因此不需要缓冲 - 因此整个序列可以直接写入输出(嗯,它仍然使用缓冲区内部改善 IO,但它在这里汇集缓冲区,以最大限度地重用)。这就像子对象一样简单:

[ProtoMember(11, DatFormat = DataFormat.Grouped)]
public Customer Customer {get;set;} // a sub-object

(其中11没有意义)

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 2021-04-28
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多