2

为了混淆应用程序代码但仍然能够使用序列化来保存应用程序数据,我想将所有序列化成员的名称映射到自定义序列化名称。我知道我可以通过实现 ISerizableInterface 来实现这一点,但在 MSDN 中,他们建议使用 OnDeserializedAttribute、OnSerializingAttribute、OnSerializedAttribute 和 OnDeserializingAttribute 进行序列化。所以我想使用 OnSerializingAttribute 来重命名我的成员。问题是我找不到明确确定序列化成员的名称的方法。

是否可以使用 OnSerializingAttribute 显式定义序列化名称?

4

3 回答 3

1

我认为自定义序列化和 ISerializable 接口将是您情况下最有效的方式。在此处查看示例。此外,这里还有一个关于您提到的 ISerializable 和序列化属性的很好的讨论线程。

我想说,如果你想完全控制格式,你应该使用自定义序列化程序,如果你想响应(反)序列化流程,属性是最好的选择。

于 2009-03-30T15:40:38.870 回答
1

编辑:我决定把它写成一篇博客文章,因为我已经多次看到它很有用)

在为此使用protobuf-net之前,我已经有用户;这使用 Google 的密集二进制“协议缓冲区”线路格式,其中不包括线路上的任何名称 - 只是数字。这意味着:

  • 名字没有暴露在电线上
  • 运行时类中的名称是“DateOfBirth”还是“a1v”都没有关系

这通过将整数标签分配给成员(属性或字段)来工作 - 例如:

[ProtoMember(4)]
public DateTime DateOfBirth {get;set;}

序列化中仅使用“4”,但(重要的是)您不需要维护大量序列化代码。ISerializable如果您需要使用远程处理,也可以很容易地挂接,如果您愿意,还可以使用 WCF 挂钩。

披露:我是作者,所以我有偏见 - 但该工具是免费的,所以你不会因为看而失去任何东西;-p

于 2009-03-30T19:21:47.840 回答
1

如果您使用的是 .NET4 或 .NET4.5,您可以定义自己的 DataContractResolver 来重命名属性,但使用[DataMember(...)]属性中命名的压缩会更简单

于 2012-05-29T16:03:30.107 回答