我需要序列化哪些字段和属性?

4
我认为这不是重复问题。我已经阅读了一些内容,但没有找到与此相同的内容。似乎字段可以在二进制格式和protobuf中进行序列化,但不能在XML中进行序列化。我不知道JSON。
我正在考虑使用protobuf-net替换标准的.NET二进制序列化器。原因是提高速度并获得更小的持久化文件大小。
在.NET二进制中,我只需将类标记为可序列化,然后就完成了。我认为这样做不好。
对于protobuf-net,我需要使用[ProtoMember()]属性指定要序列化的内容。我的新手测试显示,如果标记为自动属性,则会序列化私有字段。
我不想改变类代码定义,因为我仍然需要能够反序列化由NET序列化器创建的旧持久化数据。我混合了以下内容:
1.在类内部使用的私有字段 2.在构造函数中设置值的私有字段 3.用于非自动属性的后备字段的私有字段 4.具有上述后备字段的属性 5.自动属性 6.没有设置器的属性,返回一些计算或内部确定的值
还有可能有其他类型的字段和属性。
我想我需要持久化表示对象状态的任何值,在从文件反序列化后无法构造该值。
我想,持久化每个字段和属性都没有坏处,但这只会使工作变慢,文件比必要的大。
我认为可以忽略仅在类内部使用且不从外部设置的私有字段。我认为应该持久化在构造函数中设置的那些字段。我不确定后备字段-更好地持久化它们还是公共属性?我必须持久化自动属性。我无法持久化没有设置器的属性,因此需要持久化用于计算它们的任何字段/属性。
我是正确的还是错过了重点?
提前感谢您。

1
protobug-net - 这是一个故意的错别字吗? - H H
@Henk - 不是 - 相当尴尬 - 我不想让马克不高兴!! 我只是把它弄对了。 - ScruffyDuck
3
我应该序列化哪些字段和属性?任何您想要持久化的都可以。 - mre
@mre - 好的,但我想在哪些需要持久化方面得到一些指导 8-) 嗯,我想我当然应该知道。最终,我想我没有足够好的测试代码来确保需要持久化的内容会被正确还原。 - ScruffyDuck
@ScruffyDuck 我会假装没有注意到那个笔误 ;p - Marc Gravell
1个回答

3

我们无法确定需要序列化的内容。 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-) - ScruffyDuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接