Serialization 是否可以挂接protobuf网络序列化程序以添加一些自定义逻辑?

Serialization 是否可以挂接protobuf网络序列化程序以添加一些自定义逻辑?,serialization,protobuf-net,Serialization,Protobuf Net,这可能有些过分,但我试图通过让双方保留先前传输的URI的副本来减少客户端/服务器协议的网络消耗,以便在后续聊天中使用2-4字节占位符而不是完整的URI 问题是,我认为通过传输所有复杂对象来查找需要处理的URI会花费相当大的成本,而序列化程序已经在访问所有这些字段,并且可能使用比反射快得多的机制 这可以在protobuf net中完成吗?您是否可以自定义您正在使用的对象,以便标记您的URI,并让它们继承或实现一个接口,您可以检查该特定对象是否是标记器 然后,如果是这种情况,您可能可以使用序列化之前

这可能有些过分,但我试图通过让双方保留先前传输的URI的副本来减少客户端/服务器协议的网络消耗,以便在后续聊天中使用2-4字节占位符而不是完整的URI

问题是,我认为通过传输所有复杂对象来查找需要处理的URI会花费相当大的成本,而序列化程序已经在访问所有这些字段,并且可能使用比反射快得多的机制


这可以在protobuf net中完成吗?

您是否可以自定义您正在使用的对象,以便标记您的URI,并让它们继承或实现一个接口,您可以检查该特定对象是否是标记器


然后,如果是这种情况,您可能可以使用
序列化之前
/
反序列化之后
进行转换。

如果这是对
序列化
/
反序列化
的单个调用的一部分(即,您的数据在多个位置重复了相同的uri),那么您已经可以这样做了,只需告诉它将这些字符串视为引用(它对字符串有特殊处理,因此相同字符串内容的两个不同引用计数相等):

在序列化过程中,当它第一次发现一个新的字符串值(用
AsReference=true
修饰)时,它将生成一个表示该字符串的唯一标记;相同字符串的所有后续用法将仅序列化令牌


如果这是在对
序列化
/
反序列化
的单独调用中,则否:您必须手动执行。我可以想出一些方法,但我认为最好在序列化层之外进行处理。

理想情况下介于两者之间,但我没有看到一种不通过大量内容进行反思的简单方法。我从来不知道protobuf的这个特性,我只是把它添加到一些关键的地方,发现节省了50%!Thx@HarryMexican只需注意:这是一个突破性的改变-旧数据将与之不兼容。如果你不反对添加一个额外的属性(可以是私有的,不需要字段),有一些方法可以使它向后兼容。我同意在启动前中断。虽然我猜这是protobuf网络特有的功能,对吧?正如在中一样,我正在失去与其他协议缓冲区实现的兼容性,因为我决定使用它?@HarryMexican protobuf-net only:yes;失去兼容性:是和否;数据是有线兼容的,但任何其他实现都必须手动查看捆绑在Yeah中的
NetObjectProxy
消息类型,并按照这些思路进行思考。我认为这是可能的,但相当痛苦,而且CPU密集,所以我坚持使用Marc上面描述的AsReference选项。它减少了跨数据抽象层的大部分重复。Thx用于响应+1
[ProtoMember(7, AsReference=true)]
public string Uri {get;set;}