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 à:
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
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.