为了混淆应用程序代码但仍然能够使用序列化来保存应用程序数据,我想将所有序列化成员的名称映射到自定义序列化名称。我知道我可以通过实现ISerizableInterface来实现这一点,但在MSDN中,他们建议使用OnDeserializedAttribute,OnSerializingAttribute,OnSerializedAttribute和OnDeserializingAttribute进行序列化。所以我想使用OnSerializingAttribute重命名我的成员。问题是我无法找到一种方法来明确确定成员序列化的名称。
是否可以使用OnSerializingAttribute显式定义序列化的名称?
答案 0 :(得分:1)
我认为自定义序列化和ISerializable接口将是您的最有效的方式。查看示例here。同样here's是您提到的ISerializable和序列化属性的良好讨论主题。
我想说如果你想完全控制格式,你应该使用自定义序列化程序,如果你想响应(反)序列化流,属性是最好的选择。
答案 1 :(得分:1)
(编辑:我决定将其写为blog entry,因为我已经看过很多次了。
在使用protobuf-net之前,我已经有了用户;这使用谷歌的密集二进制“协议缓冲”线格式,它不包括线上的任何名称 - 只是数字。这意味着:
这可以通过为成员(属性或字段)分配整数标记来实现 - 例如:
[ProtoMember(4)]
public DateTime DateOfBirth {get;set;}
序列化中只使用“4”,但(重要的是)您不需要维护大量的序列化代码。如果你需要使用远程处理,也可以非常容易地连接到ISerializable
,如果你想要的话,也可以有一个WCF钩子。
披露:我是作者,所以我有偏见 - 但这个工具是免费的,所以看看你不会丢失任何东西;-p
答案 2 :(得分:1)
如果您使用的是.NET4或.NET4.5,则可以定义自己的DataContractResolver来重命名属性,但只使用[DataMember(...)]
属性中的压缩命名