c# - Empezando con protobuf-net
(2)
Esto debe ayudarlo a comenzar: Source & Credit & Marc Gravell
La forma más sencilla de comenzar es simplemente escribir sus datos:
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;}
}
Ese es un buen comienzo, pero por sí solo no es suficiente para protobuf-net. A diferencia de XmlSerializer, los nombres de miembros no están codificados en los datos; en su lugar, debe elegir un número entero para identificar a cada miembro. Además, para mostrar la intención es necesario mostrar que pretendemos que este tipo sea serializado (es decir, que se trata de un contrato de datos):
[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;}
}
Como los "búferes de protocolo" son un formato binario, protobuf-net se basa en gran medida en la clase Stream; esto hace que sea fácil de usar con una amplia variedad de implementaciones. Por ejemplo, para escribir en un archivo:
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);
}
Esto escribe un archivo de 32 bytes en "person.bin". Puede que no sea obvio en lo anterior, pero Serialize es un método genérico, la línea también podría ser:
using (var file = File.Create("person.bin")) {
Serializer.Serialize<Person>(file, person);
}
Pero la mayoría de las veces podemos dejar que la inferencia de tipo genérico del compilador haga el trabajo por nosotros. Deserialización de datos
¡También necesitamos sacar datos de vuelta!
Person newPerson;
using (var file = File.OpenRead("person.bin")) {
newPerson = Serializer.Deserialize<Person>(file);
}
Esto vuelve a leer los datos de "person.bin". Tenga en cuenta que debemos indicarle el tipo esta vez (the), pero de lo contrario el código es muy similar.
Actualización: Descargar este paquete
Estoy tratando de empezar con protobuf.net.
Descargué la última versión desde here , implementé una clase [ProtoContract]
y ahora estoy intentando serializarla con ProtoBuf.Serializer.Serialize
como se describe en la documentation . El problema es que no existe tal método.
¿Cómo escribo [ProtoContract]
en el disco?
ACTUALIZACIÓN Aparentemente, tengo la versión incorrecta o algo así, pero esto es lo que parece mi clase Serialize
:
Parece que has elegido una versión "CoreOnly", ¿quizás para iOS o Unity? Eso significa que está utilizando la descarga de google-code. En la raíz de ese paquete hay un "Qué archivos necesito.txt" que explica para qué son las diferentes compilaciones. Probablemente debería estar usando una compilación "completa". O más simplemente, use el despliegue de NuGet que solo incluye compilaciones "completas".
Si desea utilizar "CoreOnly", probablemente debería usar la herramienta separada de "precompilación" para generar un serializador personalizado, luego:
var ser = new MyCustomSerializer();
ser.Serialize(...);
Este escenario está destinado principalmente a marcos ligeros como Windows Phone, Silverlight, iOS, etc., donde la meta-programación / reflexión es muy limitada o está totalmente prohibida.