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

标签 .net protobuf-net

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

我如何启用它?

谢谢。

最佳答案

这里有两种不同类型的实习;反序列化时有实习 - 这总是启用的,所以如果数据中有重复,你应该只看到一个 .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]; }
}

关于.net - 如何在 protobuf-net 中启用字符串实习?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6463460/

相关文章:

asp.net - 在 SELECT 子句中显示不同 COUNT 的存储过程

c# - 在任务中使用异步套接字

c# - RedisSessionStateProvider 与 ProtoBuf 序列化导致错误

c# - 为什么我的 protobuf-net 流不起作用?

c# - 是否可以将 packaging.package 写入流而不必先将其保存到文件中?

c# - 改进 CI 构建时间 (.NET)

c# - 通过序列化对象列表来奇怪的 Protobuf 加速

C# protobuf-net - 默认值覆盖来自 protobuf 数据的值

c# - 继承和已知类型问题

c# - 如果以线程安全的方式不为空则返回属性