Подтвердить что ты не робот

Начало работы с protobuf-net

Я пытаюсь начать работу с protobuf.net.

Я загрузил последнюю версию здесь, реализовал класс [ProtoContract], и теперь я пытаюсь сериализовать его с помощью ProtoBuf.Serializer.Serialize, как описано в документации. Проблема в том, что такого метода нет.

Как написать [ProtoContract] на диск?

UPDATE По-видимому, у меня неправильная версия или что-то в этом роде, но вот, что мой класс Serialize выглядит следующим образом:

protobuf.net Serializer class as I see it

4b9b3361

Ответ 1

Это должно помочь вам начать с него: Источник и кредит и Марк Гравелл


Самый простой способ начать работу - просто написать свои данные:

class Person {
    public int Id {get;set;}
    public string Name {get;set;}
    public Address Address {get;set;}
}
class Address {
    public string Line1 {get;set;}
    public string Line2 {get;set;}
}

Это хорошее начало, но само по себе недостаточно для protobuf-net. В отличие от XmlSerializer, имена участников не кодируются в данных - вместо этого вы должны выбрать целое число для идентификации каждого члена. Кроме того, чтобы показать намерение, необходимо показать, что мы предполагаем, что этот тип будет сериализован (т.е. Что это контракт данных):

[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;}
}

Поскольку "буферы протоколов" - это двоичный формат, protobuf-net сильно основан на классе Stream; это делает его простым в использовании с широким спектром реализаций. Например, для записи в файл:

var person = new Person {
    Id = 12345, Name = "Fred",
    Address = new Address {
        Line1 = "Flat 1",
        Line2 = "The Meadows"
    }
};
using (var file = File.Create("person.bin")) {
    Serializer.Serialize(file, person);
}

Это записывает 32-байтовый файл в "person.bin". Это может быть не очевидно в приведенном выше, но Serialize - это общий метод - строка также может быть:

using (var file = File.Create("person.bin")) {
    Serializer.Serialize<Person>(file, person);
}

Но большую часть времени мы можем позволить компилятору использовать общий вывод типа для нашей работы. Дезаминирование данных

Нам также нужно вернуть данные!

Person newPerson;
using (var file = File.OpenRead("person.bin")) {
    newPerson = Serializer.Deserialize<Person>(file);
}

Это считывает данные с "person.bin". Обратите внимание, что нам нужно указать тип этого времени (the), но в остальном код очень похож.


Обновление: Загрузить этот пакет All seems fine

Ответ 2

Похоже, вы собрали сборку CoreOnly, возможно, для iOS или Unity? Это означает, что вы используете загрузку Google-кода. В корне этого пакета находится "Какие файлы мне нужны .txt", который объясняет, для чего нужны разные сборки. Вероятно, вы должны использовать сборку "Полный". Или, проще говоря, используйте развертывание NuGet, которое включает только "полноценные" сборки.

Если вы хотите использовать "CoreOnly", вероятно, вы должны использовать отдельный инструмент "прекомпиляции" для создания пользовательского сериализатора, а затем:

 var ser = new MyCustomSerializer();
 ser.Serialize(...);

Этот сценарий предназначен в первую очередь для легких фреймворков, таких как Windows Phone, Silverlight, iOS и т.д., где мета-программирование/отражение либо очень ограничено, либо полностью запрещено.