2014-09-23 2 views
2

Я начинаю с protobuf, и у меня проблемы. Надеюсь, вы можете мне помочь:Protobuf-net не сериализуется? Вывод почти простого текста

Я опробовал [пример] [1] страницы protobuf-net и получил он работает. Я продлил это, что хранится не только один человек, но и другой класс данных, который содержит список из 10000 человек. Затем я сериализовал этот класс данных и просмотрел вывод. Я ожидал увидеть некоторый двоичный материал и был удивлен увидеть почти все, как обычный текст:

π`Fred 
Flat 1The Meadows 
π`Fred 
Flat 1The Meadows 
π`Fred 
Flat 1The Meadows 
π`Fred 
Flat 1The Meadows 
π`Fred 
... 

Мой код очень прост:

namespace SNSClient.Assets.Scripts.GamePlay.Testing 
{ 
    [ProtoContract] 
    class Person 
    { 
     [ProtoMember(1)] 
     public int Id {get;set;} 
     [ProtoMember(2)] 
     public string Name {get; set; } 
     [ProtoMember(3)] 
     public Address Address {get;set;} 
    } 

    [ProtoContract] 
    class Address 
    { 
     [ProtoMember(1)] 
     public string Line1 {get;set;} 
     [ProtoMember(2)] 
     public string Line2 {get;set;} 
    } 

    [ProtoContract] 
    class MyProtoDataHolder 
    { 
     [ProtoMember(1)] 
     public List<Person> persons { get; set; } 
    } 
} 

Для сериализации:

List<Person> dataList = new List<Person>(); 
for (int i = 0; i < 100000; i++) 
{ 
    var person = new Person { 
    id = 12345, Name = "Fred", 
    Address = new Address { 
    Line1 = "Flat 1", 
    Line2 = "The Meadows" 
    } 
    }; 

    dataList.Add(person); 
} 
var data = new MyProtoDataHolder() {persons = dataList}; 

using (var file = File.Create(Application.dataPath + "/dataList.bin")) 
{ 
    Serializer.Serialize(file, data); 
} 

Я м, ожидая, что я что-то упустил, потому что размер выходного файла не то, что я ожидал бы.

Спасибо за помощь!

+2

Поскольку 'Name' и' Address' являются строками, значения будут считаны. Если вы не хотите, чтобы вы могли использовать [CryptoStream] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptostream (v = vs.110) .aspx? Cs-save- Ланг = 1 & CS-Ланг = CSharp # код-фрагмент-1). – Plutonix

+0

Если вы десериализуете свой файл, будут ли таким образом восстановлены классы, идентичные оригиналам? Или есть какая-то реальная разница? – dbc

+0

* почему * вы считаете, что это * есть * сериализация неправильная? –

ответ

3

В ваших данных преобладает текст. Формат Protobuf проволоки кодирует текст как UTF-8, так что имеет смысл, что:

  1. файлы являются почти читаемыми (и содержат оригинальные текстовые значений четко заметны для большинства текстовых редакторов)
  2. размера файла не сильно отличается от исходного содержания

В принципе: хорошо выглядит для меня. Если вы хотите, чтобы он сжался, пропустите его через что-то вроде GZipStream или DeflateStream тоже (в обоих направлениях, очевидно). В качестве побочного примечания: если ваши данные real будут иметь много повторяющихся данных, protobuf-net имеет некоторые флажки выбора, позволяющие использовать такие объекты, как повторное использование объектов и строк (каждый раз хранит только токен, а не всю строку) - однако будет неудобно читать это в других библиотеках буферов протоколов (т. е. не protobuf-net), поскольку эта функциональность не является частью основной спецификации.

+0

Хорошо, спасибо @Marc за то, что указали это на флаги opitmization. Я искал точные данные, так как у меня будет несколько повторяющихся данных и что я хочу optmized. – ffyhlkain

+0

@ffyhlkain 'AsReference' в частности –

Смежные вопросы