这可能有些夸大其词,但我正在尝试通过让两端都保留以前传输的URI的副本来减少客户机/服务器协议的网络消耗,以便在随后的聊天中使用2-4字节的占位符而不是完整的URI。
问题是,我认为通过传输的所有复杂对象进行反射以定位需要处理的URI将是相当昂贵的,而序列化程序已经在访问所有这些字段,并且可能使用比反射快得多的机制。
这可以在protobuf-net中完成吗?
发布于 2012-08-30 15:07:50
如果这是对Serialize
/Deserialize
的单个调用的一部分(即,您的数据具有在多个位置重复的相同uri ),那么您已经可以这样做了,只需告诉它将这些字符串视为引用(它对字符串有特殊的处理,因此相同字符串内容的两个不同引用算作相等):
[ProtoMember(7, AsReference=true)]
public string Uri {get;set;}
在序列化过程中,当它第一次发现新的字符串值(用AsReference=true
修饰)时,它将生成一个惟一的令牌来表示该字符串;同一字符串的所有后续使用都将仅序列化该令牌。
如果这是在对Serialize
/Deserialize
的单独调用中进行的,则否:您必须手动执行此操作。我可以想出一些方法来做到这一点,但我认为在序列化层之外处理这一点会更好。
发布于 2012-08-30 09:49:40
您是否可以自定义您正在使用的对象,以便标记您的URI,并让它们继承或实现一个接口,以便您可以检查该特定对象是否为Tokenizer。
如果是这样的话,您也许能够使用BeforeSerialization
/ AfterDeserialization
来进行转换。
https://stackoverflow.com/questions/12187596
复制相似问题