这可能有点过分,但我试图减少客户端/服务器协议的网络消耗,让双方都保留以前传输的URI的副本,以便使用2-4个字节的占位符而不是完整的URI随后的喋喋不休。
问题是我认为反映所有传输的复杂对象来定位需要处理的URI会非常昂贵,而序列化程序已经访问了所有这些字段,并且可能使用比反射更快的机制。
这可以在protobuf-net中完成吗?
答案 0 :(得分:2)
如果这是对Serialize
/ Deserialize
的一次调用的一部分(即您的数据在多个位置重复相同的uri),那么您可以已经执行此操作 ,只需告诉它将这些字符串视为引用(它具有字符串的特殊处理,因此相同字符串内容的两个不同引用计为相等):
[ProtoMember(7, AsReference=true)]
public string Uri {get;set;}
在序列化过程中,第一次发现 新 字符串值(用AsReference=true
修饰)时,它将生成一个唯一的标记来表示字符串;该相同字符串的所有后续用法将序列化仅该令牌。
如果这是对Serialize
/ Deserialize
的单独调用,则为no:您必须手动执行此操作。我可以想一些这样做的方法,但我认为这样可以更好地处理序列化层的 。
答案 1 :(得分:1)
您是否可以自定义要使用Tokenise URI的对象,并让它们继承或实现一个接口,您可以检查该特定对象是否为Tokenizer。
如果是这种情况,您可以使用BeforeSerialization
/ AfterDeserialization
进行转换。