protobuf-net入门 [英] Getting started with protobuf-net

查看:48
本文介绍了protobuf-net入门的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用protobuf.net.

我已经从&马克·格雷夫(Marc Gravell)


最简单的入门方法就是编写数据:

  class Person {public int ID {get; set;}公共字符串名称{get; set;}公共地址地址{get; set;}}班级地址{公用字符串Line1 {get; set;}公用字符串Line2 {get; set;}} 

这是一个很好的开始,但是对于protobuf-net而言,仅此还不够.与XmlSerializer不同,成员名称未在数据中编码-而是必须选择一个整数来标识每个成员.另外,为了显示意图,有必要表明我们打算将此类型序列化(即,它是一个数据协定):

  [ProtoContract]班级人员{[ProtoMember(1)]public int ID {get; set;}[ProtoMember(2)]公共字符串名称{get; set;}[ProtoMember(3)]公共地址地址{get; set;}}[ProtoContract]班级地址{[ProtoMember(1)]公用字符串Line1 {get; set;}[ProtoMember(2)]公用字符串Line2 {get; set;}} 

由于协议缓冲区"是二进制格式,因此protobuf-net很大程度上基于Stream类.这使得它易于与多种实现方式一起使用.例如,要写入文件:

  var person = new Person {ID = 12345,名称="Fred",地址=新地址{Line1 ="Flat 1",Line2 =草地"}};使用(var file = File.Create("person.bin")){Serializer.Serialize(file,person);} 

这会将32字节文件写入"person.bin".在上面可能并不明显,但是Serialize是一种通用方法-该行也可以是:

 使用(var file = File.Create("person.bin")){Serializer.Serialize< Person>(文件,人);} 

但是大多数时候,我们可以让编译器的泛型类型推断为我们完成工作.反序列化数据

我们还需要拿回数据!

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

这将从"person.bin"读取数据.请注意,这次我们需要告诉它类型(),否则代码非常相似.


更新:下载此程序包

I'm trying to get started with protobuf.net.

I've downloaded the latest version from here, implemented a [ProtoContract] class, and now I'm trying to serialize it with ProtoBuf.Serializer.Serialize as described in the documentation. The problem is, that there is no such method.

How do I write [ProtoContract] to disk?

UPDATE Apparently, I've got the wrong version of it or something, but here's what my Serialize class looks like:

解决方案

This must help you get started with it : Source & Credit & Marc Gravell


The simplest way to get started is simply to write your data:

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

That is a good start, but by itself is not enough for protobuf-net. Unlike XmlSerializer, the member-names are not encoded in the data - instead, you must pick an integer to identify each member. Additionally, to show intent it is necessary to show that we intend this type to be serialized (i.e. that it is a data contract):

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

Since "protocol buffers" is a binary format, protobuf-net is based heavily around the Stream class; this makes it simple to use with a wide variety of implementations. For example, to write to a file:

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

This writes a 32 byte file to "person.bin". It might not be obvious in the above, but Serialize is a generic method - the line could also be:

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

But most of the time we can let the compiler's generic type inference do the work for us. Deserializing Data

We also need to get out data back!

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

This reads the data back from "person.bin". Note we need to tell it the type this time (the ), but otherwise the code is very similar.


Update : Download this package

这篇关于protobuf-net入门的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆