当前位置: 首页 > news >正文

.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 intStudentId { get; set; }
        [ProtoMember(2)]
        public stringName { get; set; }
        [ProtoMember(3)]
        public stringClassName { 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" +
                                  "className:" + 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();
        }
   }


 

相关文章:

  • 要学的勤快点.
  • 浏览器事件模型与jquery事件
  • 嵌入式linux GUI--DirectFB + GTK至尊秘笈
  • JavaScript事件捕获与事件冒泡原理
  • Nebula3的渲染流程
  • jquery 小记
  • 使用asx3m与xstream配合解决flex与java利用httpservice传递xml数据问题
  • 你必须知道的最好的开源WEB 资源
  • 四种流行的AJAX框架jQuery,Mootools,Dojo,ExtJS的对比
  • 平衡二叉查找树(AVL)
  • 数据结构之链栈 C++实现
  • C#中用NamedPipe进程间通信
  • C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数
  • 实现两个DataTable的联合查询
  • 数学之美:GOOGLE新闻归类算法与余弦定理
  • Javascript基础之Array数组API
  • python docx文档转html页面
  • React Transition Group -- Transition 组件
  • Service Worker
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 给初学者:JavaScript 中数组操作注意点
  • 技术发展面试
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 小程序button引导用户授权
  • 如何用纯 CSS 创作一个货车 loader
  • ​【已解决】npm install​卡主不动的情况
  • ​ArcGIS Pro 如何批量删除字段
  • # .NET Framework中使用命名管道进行进程间通信
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (SpringBoot)第七章:SpringBoot日志文件
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (十八)三元表达式和列表解析
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core控制台应用程序初识
  • .NET Core跨平台微服务学习资源
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET运行机制
  • @Async注解的坑,小心
  • @Data注解的作用
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @synthesize和@dynamic分别有什么作用?
  • [Android]创建TabBar
  • [C#]C# winform部署yolov8目标检测的openvino模型