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