.net 如何在protobuf网络中启用字符串实习?

.net 如何在protobuf网络中启用字符串实习?,.net,protobuf-net,.net,Protobuf Net,我使用的是v2版本421。 当我保存protobuf net生成的流并将其放入strings实用程序时,它发现了许多重复的字符串。我说的是应用程序生成的字符串,它可以被插入,但是字符串插入在默认情况下似乎没有打开 我如何启用它 谢谢。这里有两种不同的实习方式;反序列化时有一个interning-这总是启用的,因此如果数据中有重复项,您应该在托管类中只看到一个.NETstring实例,可以根据需要多次重复使用 在序列化时还可以使用interning,以避免在序列化时将数据复制到流中。默认情况下,这

我使用的是v2版本421。 当我保存protobuf net生成的流并将其放入strings实用程序时,它发现了许多重复的字符串。我说的是应用程序生成的字符串,它可以被插入,但是字符串插入在默认情况下似乎没有打开

我如何启用它


谢谢。

这里有两种不同的实习方式;反序列化时有一个interning-这总是启用的,因此如果数据中有重复项,您应该在托管类中只看到一个.NET
string
实例,可以根据需要多次重复使用

在序列化时还可以使用interning,以避免在序列化时将数据复制到流中。默认情况下,这是而不是,原因很简单,protobuf规范中没有定义此类行为;protobuf net在默认情况下尝试保持在规范内,仅在选择加入的基础上使用扩展

如果要为protobuf net=to=protobuf net usage启用此选项,请为任何给定字符串启用
AsReference
选项:

[ProtoMember(13, AsReference = true)]
public string Foo { get; set; }
这使用protobuf网络实现特定的表示。然而,出于互操作的目的,它不会发挥很好的作用。如果您需要以可互操作的方式进行此操作,唯一要做的就是单独存储列表(可能在
列表
中的某个位置),并在数据中使用列表中的位置,即

// this is .... uglier, but probably easier if you need cross-platform
public int FooOffset {
    get { return Foos.IndexOf(Foo); }
    set { Foo = Foos[value]; }
}

谢谢有件事我不明白。即使它是protobuf网络的特定功能,它产生的协议缓冲流仍然是有效流,对吗?您仍然可以创建相应的.proto规范-如果我是正确的,这仍然需要移植到v2。我很好奇,不带AsReference的.proto和带AsReference的.proto有什么区别。经典的
string foo=13
,与
netObject foo=13
有什么区别,其中
netObject
是一种单独的消息类型,具有一些属性;在这种情况下,重要的是
intexistingkey=1
、intnewkey=2`和
字节有效负载=10
;将发送一个新字符串,其中包含“2=>某个唯一数字,10=>字符串”;重复的字符串将与“1=>我们之前想到的数字”一起发送。一旦将相关代码移植到v2,检查相应的.proto文件将非常有趣。好的,我有一个问题。我如何使用模型来实现它?问题是,我的代理项具有DataContract/DataMember属性,我不引用protobuf net,除非是在负责(反)序列化的唯一程序集中。@将其标记为ValueMember上的引用