使用.Net OnSerializingAttribute来改变变量名?

时间:2009-03-30 15:29:04

标签: .net serialization .net-2.0 obfuscation

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

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

3 个答案:

答案 0 :(得分:1)

我认为自定义序列化和ISerializable接口将是您的最有效的方式。查看示例here。同样here's是您提到的ISerializable和序列化属性的良好讨论主题。

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

答案 1 :(得分:1)

编辑:我决定将其写为blog entry,因为我已经看过很多次了。

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

  • 名称未在电线上公开
  • 运行时类中的名称是“DateOfBirth”还是“a1v”
  • 无关紧要

这可以通过为成员(属性或字段)分配整数标记来实现 - 例如:

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

序列化中只使用“4”,但(重要的是)您不需要维护大量的序列化代码。如果你需要使用远程处理,也可以非常容易地连接到ISerializable,如果你想要的话,也可以有一个WCF钩子。

披露:我是作者,所以我有偏见 - 但这个工具是免费的,所以看看你不会丢失任何东西;-p

答案 2 :(得分:1)

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

会更简单