zoukankan      html  css  js  c++  java
  • Protobufnet使用示例

    本示例使用ProtoBuf的.Net社区版本:https://github.com/mgravell/protobuf-net。创建控制台程序,从NuGet中搜索并安装作者为Marc Gravell的版本。

    1、GIthub示例(包含关系)

    [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; }
    }
    2、继承示例

    [ProtoContract]
    [ProtoInclude(100, typeof(DerivedClass))]
    public class BaseClass
    {
    [ProtoMember(1)]
    public int Id { get; set; }
    }
    [ProtoContract]
    public class DerivedClass : BaseClass
    {
    [ProtoMember(1)]
    public string Name { get; set; }
    [ProtoMember(2)]
    public int Age { get; set; }
    }
    3、序列化/反序列化

    public class ProtoHelper
    {
    public static byte[] Serialize<T>(T t)
    {
    var stream = new MemoryStream();
    Serializer.Serialize<T>(stream, t);
    var bytes = stream.ToArray();
    stream.Close();
    stream.Dispose();
    return bytes;
    }

    public static T Deserialize<T>(byte[] bytes)
    {
    var stream = new MemoryStream(bytes);
    var t = Serializer.Deserialize<T>(stream);
    stream.Close();
    stream.Dispose();
    return t;
    }
    }
    4、测试类

    public class TestProtoBuf
    {
    private byte[] _bufferPerson;
    private byte[] _bufferDerivedClass;

    public void Serialize()
    {
    var person = new Person()
    {
    Id = 101,
    Name = "ZhangSan",
    Address = new Address()
    {
    Line1 = "ZhengZhou",
    Line2 = "Kexue Rd."
    }
    };
    Console.WriteLine("Before Person Serialize: {0}, {1}, {2}, {3}",
    person.Id, person.Name, person.Address.Line1, person.Address.Line2);
    _bufferPerson = ProtoHelper.Serialize(person);

    var derivedClass = new DerivedClass()
    {
    Id = 12,
    Name = "test class",
    Age = 23
    };
    Console.WriteLine();
    Console.WriteLine("Before DerivedClass Serialize: {0}, {1}, {2}",
    derivedClass.Id, derivedClass.Name, derivedClass.Age);
    _bufferDerivedClass = ProtoHelper.Serialize(derivedClass);
    }

    public void Deserialize()
    {
    if (_bufferPerson != null)
    {
    var person = ProtoHelper.Deserialize<Person>(_bufferPerson);
    Console.WriteLine();
    Console.WriteLine("After Person Serialize: {0}, {1}, {2}, {3}",
    person.Id, person.Name, person.Address.Line1, person.Address.Line2);
    }

    if (_bufferDerivedClass != null)
    {
    var derivedClass = ProtoHelper.Deserialize<DerivedClass>(_bufferDerivedClass);
    Console.WriteLine();
    Console.WriteLine("After DerivedClass Serialize: {0}, {1}, {2}",
    derivedClass.Id, derivedClass.Name, derivedClass.Age);
    }
    }
    }
    5、测试代码

    var testProtoBuf = new TestProtoBuf();
    testProtoBuf.Serialize();
    testProtoBuf.Deserialize();

  • 相关阅读:
    CSU 1505: 酷酷的单词【字符串】
    HDU 2036 改革春风吹满地【计算几何/叉乘求多边形面积】
    HDU 2034 人见人爱A-B【STL/set】
    HDU 2031 进制转换
    HDU 1020 Encoding【连续的计数器重置】
    HDU 1999 不可摸数【类似筛法求真因子和】
    动态规划总结
    CSU 1785: 又一道简单题
    CSU 1779: 错误的算法【矩阵/模拟】
    CSU 1777: 大还是小?【模拟/后导0】
  • 原文地址:https://www.cnblogs.com/simadi/p/15606163.html
Copyright © 2011-2022 走看看