web-dev-qa-db-fra.com

Débuter avec protobuf-net

J'essaie de commencer avec protobuf.net.

J'ai téléchargé la dernière version de ici , implémenté un [ProtoContract] classe, et maintenant j'essaie de le sérialiser avec ProtoBuf.Serializer.Serialize comme décrit dans la documentation . Le problème est qu'il n'existe pas une telle méthode.

Comment écrire [ProtoContract] sur le disque?

[~ # ~] mise à jour [~ # ~] Apparemment, j'ai la mauvaise version ou quelque chose, mais voici ce que mon Serialize la classe ressemble à:

protobuf.net Serializer class as I see it

32
Arsen Zahray

Cela doit vous aider à démarrer: Source & Credit & Marc Gravell


La façon la plus simple de commencer est simplement d'écrire vos données:

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

C'est un bon début, mais en soi, ce n'est pas suffisant pour protobuf-net. Contrairement à XmlSerializer, les noms de membres ne sont pas codés dans les données - à la place, vous devez choisir un entier pour identifier chaque membre. De plus, pour montrer l'intention, il est nécessaire de montrer que nous avons l'intention de sérialiser ce type (c'est-à-dire qu'il s'agit d'un contrat de données):

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

Étant donné que les "tampons de protocole" sont un format binaire, protobuf-net est fortement basé sur la classe Stream; cela le rend simple à utiliser avec une grande variété d'implémentations. Par exemple, pour écrire dans un fichier:

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

Cela écrit un fichier de 32 octets dans "person.bin". Cela peut ne pas être évident dans ce qui précède, mais Serialize est une méthode générique - la ligne pourrait également être:

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

Mais la plupart du temps, nous pouvons laisser l'inférence de type générique du compilateur faire le travail pour nous. Désérialisation des données

Nous devons également récupérer les données!

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

Cela lit les données de "person.bin". Notez que nous devons lui dire le type cette fois (le), mais sinon le code est très similaire.


Mise à jour: Télécharger ce package All seems fine

29
PaRiMaL RaJ

Il semble que vous ayez choisi une version "CoreOnly", peut-être pour iOS ou Unity? Cela signifie que vous utilisez le téléchargement de code Google. À la racine de ce package se trouve un "De quels fichiers ai-je besoin.txt" qui explique à quoi servent les différentes versions. Vous devriez probablement utiliser une version "complète". Ou plus simplement, utilisez le déploiement NuGet qui ne comprend que les versions "complètes".

Si vous souhaitez utiliser "CoreOnly", vous devriez probablement utiliser l'outil séparé de "précompilation" pour générer un sérialiseur personnalisé, puis:

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

Ce scénario est principalement destiné aux frameworks légers comme Windows Phone, Silverlight, iOS, etc. - où la méta-programmation/réflexion est soit très limitée, soit totalement interdite.

8
Marc Gravell