protobuf-net 简介

      protobuf-net是Google的ProtocolBuffer的.net实现。ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。

引用protobuf-net.dll组件

1、能过特性定义ProtoBuf格式的类

[ProtoContract] 
public class User 

    [ProtoMember(1, IsRequired = true)] 
    public int UserID { get; set; }

    [ProtoMember(2, IsRequired = true)] 
    public string UserName { get; set; }

}

required表示在这个消息中这个字段是必须的,就像数据库中的非空字段一样的,必须要有值。 
optional表示是可选的,可以有,也可以没有,对应到数据库中的就可空字段。 
repeated表示这个字段是可以重复的,一个消息是可以有一个或多个这个字段的。

2、序列化:

using (Stream file = File.Create(path)) 

    Serializer.Serialize<List<User>>(file, list); 
    file.Close(); 
}

3、反序列化:

List<User> list2 = new List<User>(); 
using (Stream file = File.OpenRead(path)) 

    list2 = Serializer.Deserialize<List<User>>(file); 
}

4、例子:

namespace ConsoleApplication1 

    class Program 
    { 
        static void Main(string[] args) 
        { 
            List<User> list = new List<User>(); 
            for (int i = 0; i < 1000; i++) 
            { 
                list.Add(new User() { UserID = i, UserName = "u" + i.ToString() }); 
            }

            //json 
            string path2 = AppDomain.CurrentDomain.BaseDirectory + "json.txt"; 
            System.Web.Script.Serialization.JavaScriptSerializer jss = new System.Web.Script.Serialization.JavaScriptSerializer(); 
            string json = jss.Serialize(list); 
            File.WriteAllText(path2, json);

            //protobuff 
            string path = AppDomain.CurrentDomain.BaseDirectory + "protobuf.txt"; 
            using (Stream file = File.Create(path)) 
            { 
                Serializer.Serialize<List<User>>(file, list); 
                file.Close(); 
            }

            List<User> list2 = new List<User>(); 
            using (Stream file = File.OpenRead(path)) 
            { 
                list2 = Serializer.Deserialize<List<User>>(file); 
            }

            foreach (User u in list2) 
            { 
                Console.WriteLine(string.Format("UserID={0}, UserName={1}", u.UserID, u.UserName)); 
            }

            Console.ReadKey(); 
        } 
    }

    [ProtoContract] 
    public class User 
    { 
        [ProtoMember(1, IsRequired = true)] 
        public int UserID { get; set; }

        [ProtoMember(2, IsRequired = true)] 
        public string UserName { get; set; }

    } 
}

 

测试结果:

json.txt 33k

protobuf.txt 11k

大小相差了3倍

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值