我正在使用v2 rev 421。 当我保存protobuf-net生成的流并通过字符串实用程序时,它发现了许多重复的字符串。我说的是应用程序生成的字符串,可以实现,但字符串实习似乎默认不启用。
如何启用它?
感谢。
答案 0 :(得分:4)
这里有两种不同类型的实习;在反序列化时实时 - 这始终是启用的,因此如果重复项位于数据中,您应该只在托管类中看到一个.NET string
实例,根据需要多次重复使用。
在序列化时还有实习,以避免在序列化时将数据复制到流中。默认情况下,这是 不 ,原因很简单,因为protobuf规范中没有定义此类行为; protobuf-net默认尝试保留在规范内,仅在选择加入时使用扩展名。
如果要为protobuf-net = to = protobuf-net使用启用此功能,请为任何给定字符串启用AsReference
选项:
[ProtoMember(13, AsReference = true)]
public string Foo { get; set; }
这使用了protobuf-net 特定于实现的表示。但是,它不会很好地用于互操作目的。如果您需要以可互操作的方式使用它,唯一要做的就是将列表单独存储(可能在List<string>
某处),并使用数据列表中的位置,即
// this is .... uglier, but probably easier if you need cross-platform
public int FooOffset {
get { return Foos.IndexOf(Foo); }
set { Foo = Foos[value]; }
}