【问题标题】:What fields and properties should I serialize?我应该序列化哪些字段和属性?
【发布时间】:2012-10-12 09:54:00
【问题描述】:

我不认为这是重复的。我已经阅读了一些内容,但没有找到与此相同的内容。似乎字段可以在二进制格式化程序和 protobuf 中序列化,但不能在 XML 中序列化。我不知道 JSON。

我正在考虑用 protobuf-net 替换标准的 .NET 二进制序列化程序。原因是为了提高速度并获得更小的持久文件大小。

在 NET Binary 中,我只是将类标记为可序列化,然后将其保留。我怀疑不好。

使用 protobuf-net,我需要使用 [ProtoMember()] 属性指定要序列化的内容。我的新手测试表明,如果标记为自动属性,私有字段会被序列化。

我根本不想更改类代码定义,因为我仍然需要能够反序列化由 NET 序列化程序创建的旧持久数据。我混合了:

  1. 在类中使用的私有字段
  2. 在构造函数中设置值的私有字段
  3. 作为非自动属性支持字段的私有字段
  4. 具有上述支持字段的属性
  5. 汽车属性
  6. 没有返回某些计算或内部确定值的设置器的属性

可能还有其他一些。换句话说,几乎所有类型的字段和属性。

我想我需要保留任何表示在从文件反序列化后无法构造的对象状态的值。

我想持久化每个字段和属性不会有任何害处,但这只会使工作变慢并且文件比它需要的大。

我想我可以忽略只在类内部使用而不是从外部设置的私有字段。 我想我应该坚持那些在构造函数中设置的字段。 我不确定支持字段 - 保留它们还是保留它们的公共财产更好? 我必须坚持自动属性 我无法保留没有设置器的属性,因此我需要保留在其计算中使用的任何字段/属性。

我是在正确的轨道上还是错过了重点。

提前致谢。

【问题讨论】:

  • protobug-net - 这是故意的错字吗?
  • @Henk - 不 - 相当尴尬 - 我不想让 Marc 不高兴!!我只是说对了
  • “我应该序列化哪些字段和属性?”任何你想要持久化的...
  • @mre - 很公平,但我想要一些关于哪些需要坚持的指导 8-) 我想我当然应该知道这一点。最后我想我没有足够好的测试代码来确保需要坚持的东西会回来
  • @ScruffyDuck 我会假装我没有注意到错字;p

标签: c# serialization protobuf-net


【解决方案1】:

我们不能说什么需要序列化。 BinaryFormatter 在“所有字段”的基础上工作(除非它们被明确标记为不用于序列化)。您可以使用相同的方法,但如果您使用自动实现的属性(这很好),请注意您不能将属性添加到支持字段 - 与字段不同 -类似事件,以下不是有效的 c#

[field:ProtoMember(1)] // not valid
public int X { get; set; }

这意味着您唯一明智的选择是装饰房产:

[ProtoMember(1)]
public int X { get; set; }

因为,如果您将自动实现的属性更改为常规属性,您将破坏BinaryFormatter 的反序列化,因为字段名称将已更改。不过,这很好 - 将字段 标记为序列化的属性(或两者都为同一类型)并没有错。某些平台上的另一个考虑因素是可访问性:私有字段可能无法访问,而公共字段可以正常工作。显然,公共领域非常少见。

所以:

  • 决定什么需要序列化(这个我不能告诉你)
  • 将其标记为序列化
  • 如果您需要 BinaryFormatter 继续工作,请不要将任何东西从自动实现的属性更改为常规属性(protobuf-net 不在乎您是否更改此设置)

【讨论】:

  • 感谢 Marc,抱歉打错了 8-)
猜你喜欢
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 2021-07-02
  • 2021-09-23
  • 2011-12-19
  • 2014-02-05
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多