如何在 protobuf-net 中启用字符串驻留?

mar*_*ark 5 .net protobuf-net

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

我如何启用它?

谢谢。

Mar*_*ell 5

这里有两种不同类型的实习;反序列化时有实习- 这始终是启用的,因此如果数据中有重复项您应该在托管类中只看到一个 .NETstring实例,并根据需要重复使用多次。

3.x 的更新 默认情况下不再启用字符串驻留。要启用它,请在您的模型中设置以下内容。

RuntimeTypeModel.Default.InternStrings = true;
Run Code Online (Sandbox Code Playgroud)

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

如果您想为 protobuf-net=to=protobuf-net 使用启用此功能,请AsReference为任何给定字符串启用该选项:

[ProtoMember(13, AsReference = true)]
public string Foo { get; set; }
Run Code Online (Sandbox Code Playgroud)

这使用了 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]; }
}
Run Code Online (Sandbox Code Playgroud)