如何在protobuf-net中启用字符串实习?

时间:2011-06-24 04:41:30

标签: .net protobuf-net

我正在使用v2 rev 421。 当我保存protobuf-net生成的流并通过字符串实用程序时,它发现了许多重复的字符串。我说的是应用程序生成的字符串,可以实现,但字符串实习似乎默认不启用。

如何启用它?

感谢。

1 个答案:

答案 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]; }
}