.NET中使用Protobuffer 实现序列化和反序列化

.NET中使用Protobuffer 实现序列化和反序列化

 

  1. 到官方下载protobuf-net.dll,官方地址:http://code.google.com/p/protobuf-net/

2.       建一个控制台应用程序

3.       添加类库:protobuf-net.dll到应用程序。

示例代码:

 

准备一个要测试的实体类(注意类和方法都要加上protoBuffer序列化的特性):

 

  [ProtoContract]

    public class Student

    {

        [ProtoMember(1)]

        public int StudentId { get; set; }

        [ProtoMember(2)]

        public string Name { get; set; }

        [ProtoMember(3)]

        public string ClassName { get; set; }

    }

 

然后对这个类进行序列化反序列化

 

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using ProtoBuf;

using ProtoBufferDemo.Entity;

using System.IO;

 

namespace ProtoBufferDemo

{

    class Program

    {

        private const string TestPath = @"D:/1.txt";

        static void Main(string[] args)

        {

            ////////////////////////序列化//////////////////////////////

 

            Student stu = new Student()

            {

                StudentId = 1,

                Name = "zhangsan",

                ClassName = "classOne"

            };

 

            if (!File.Exists(TestPath))

            {

               FileStream fs = File.Create(TestPath, 1024, FileOptions.Asynchronous);

               fs.Dispose();

            }

 

            Console.WriteLine("开始序列化并导出到文件...");

            using (Stream s = new FileStream(TestPath, FileMode.Open ,FileAccess.ReadWrite))

            {

                Serializer.Serialize<Student>(s, stu);

                s.Close();

            }

            Console.WriteLine("序列化完毕");

 

            //////////////////////反序列化////////////////////////////

 

            Console.WriteLine("反序列化并输出...");

            using (Stream s = new FileStream(TestPath, FileMode.Open))

            {

                Student st = Serializer.Deserialize<Student>(s);

                Console.WriteLine("studentName:" + stu.Name + "/r/n" +

                                  "studentId:" + stu.StudentId + "/r/n" +

                                  "class Name:" + stu.ClassName);

                s.Close();

            }

 

            Console.Read();

        }

    }

}

 

现在考虑一下多个实体的情况,测试一下序列化一个集合

 

class Program

    {

        private const string TestPath = @"D:/1.txt";

        static void Main(string[] args)

        {

            ////////////////////////序列化//////////////////////////////

 

            List<Student> stu = new List<Student>()

            {

                new Student(){

                StudentId = 1,

                Name = "zhangsan",

                ClassName = "classOne"},

 

                new Student(){ StudentId = 2,

                Name = "lisi",

                ClassName = "classTwo"}

            };

 

            if (!File.Exists(TestPath))

            {

                FileStream fs = File.Create(TestPath, 1024, FileOptions.Asynchronous);

                fs.Dispose();

            }

 

            Console.WriteLine("开始序列化并导出文件...");

            using (Stream s = new FileStream(TestPath, FileMode.Open, FileAccess.ReadWrite))

            {

                Serializer.Serialize<List<Student>>(s, stu);

                s.Close();

            }

            Console.WriteLine("序列化完毕");

 

            //////////////////////反序列化////////////////////////////

 

            Console.WriteLine("反序列化并输出...");

            using (Stream s = new FileStream(TestPath, FileMode.Open))

            {

                List<Student> sl = Serializer.Deserialize<List<Student>>(s);

 

                foreach (var student in sl)

                {

                    Console.WriteLine("studentName:" + student.Name + "/r/n" +

                                 "studentId:" + student.StudentId + "/r/n" +

                                 "class Name:" + student.ClassName);

                }

 

              

                s.Close();

            }

 

            Console.Read();

        }

    }

posted @ 2012-03-22 16:03  渡蓝  阅读(717)  评论(1)    收藏  举报