как включить интернирование строк в protobuf-net? - PullRequest
4 голосов
/ 24 июня 2011

Я использую v2 rev 421. Когда я сохранил поток, созданный protobuf-net, и поместил его в утилиту strings, он обнаружил много дублирующихся строк. Я говорю о строках, создаваемых приложением, которые могут быть интернированы, но интернирование строк, по-видимому, не включено по умолчанию.

Как мне это включить?

Спасибо.

1 Ответ

4 голосов
/ 24 июня 2011

Есть два отдельных типа интернирования здесь;есть интернирование при десериализации - это всегда включено, поэтому, если дубликаты находятся в данных , вы должны видеть только один экземпляр .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]; }
}
...