Есть два отдельных типа интернирования здесь;есть интернирование при десериализации - это всегда включено, поэтому, если дубликаты находятся в данных , вы должны видеть только один экземпляр .NET string
в ваших управляемых классах, повторно используемыхстолько раз, сколько необходимо.
Существует также интернирование при сериализации , чтобы избежать дублирования данных в потоке при сериализации.Это не по умолчанию, по той простой причине, что такое поведение не определено в спецификации protobuf;protobuf-net пытается остаться в спецификации по умолчанию, используя только расширения на основе подписки.
Если вы хотите включить это для использования protobuf-net = to = protobuf-net, то включите *Параметр 1016 * для любой заданной строки:
[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]; }
}