4

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

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

在 NET Binary 中,我只是将这些类标记为可序列化并保留它。我怀疑不好。

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

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

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

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

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

我想保留每个字段和属性不会有什么害处,但这只会使工作变慢并且文件比它需要的大。

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

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

提前致谢。

4

1 回答 1

3

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

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

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

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

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

所以:

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