C# Protobuf-Net 序列化

简介: 源码位置:protobuf-net1、安装Nuget : 工具--拓展管理器安装完成后重启Microsoft Visual Studio 2010,可以看到下图:小注:只有该解决方案已经打开项目的时候,才会看到下面两项:2、安装protobuf_net(在Nuget中找到protobuf-net,安装,选择项目搞定)3、封装简单操作类(在项目中引入using Prot

源码位置:protobuf-net

1、安装Nuget 

工具--拓展管理器



安装完成后重启Microsoft Visual Studio 2010,可以看到下图:

小注:

只有该解决方案已经打开项目的时候,才会看到下面两项:


2、安装protobuf_net(在Nuget中找到protobuf-net,安装,选择项目搞定)



3、封装简单操作类(在项目中引入using ProtoBuf;就可以直接用了)

    /// <summary>
    /// Protobuf_net
    /// </summary>
    public class ProtobufSerializer
    {
        /// <summary>
        /// 序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public static string Serialize<T>(T t)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                Serializer.Serialize<T>(ms, t);
                return Encoding.Unicode.GetString(ms.ToArray());
            }
        }
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="content"></param>
        /// <returns></returns>
        public static T DeSerialize<T>(string content)
        {
            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(content)))
            {
                T t = Serializer.Deserialize<T>(ms);
                return t;
            }
        }
    }

使用UTF8反序列化的时候会出现下面的错误:

---------------------------

---------------------------
System.IO.EndOfStreamException: 尝试读取超出流末尾的内容。
   在 ProtoBuf.ProtoReader.Ensure(Int32 count, Boolean strict) 位置 c:\Dev\protobuf-net\protobuf-net\ProtoReader.cs:行号 257
   在 ProtoBuf.ProtoReader.ReadString() 位置 c:\Dev\protobuf-net\protobuf-net\ProtoReader.cs:行号 494
   在 proto_2(Object , ProtoReader )
   在 ProtoBuf.Serializers.CompiledSerializer.ProtoBuf.Serializers.IProtoSerializer.Read(Object value, ProtoReader source) 位置 c:\Dev\protobuf-net\protobuf-net\Serializers\CompiledSerializer.cs:行号 57
   在 ProtoBuf.Meta.RuntimeTypeModel.Deserialize(Int32 key, Object value, ProtoReader source) 位置 c:\Dev\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:行号 775
   在 ProtoBuf.Meta.TypeModel.DeserializeCore(ProtoReader reader, Type type, Object value, Boolean noAutoCreate) 位置 c:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:行号 700
   在 ProtoBuf.Meta.TypeModel.Deserialize(Stream source, Object value, Type type, SerializationContext context) 位置 c:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:行号 589
   在 ProtoBuf.Meta.TypeModel.Deserialize(Stream source, Object value, Type type) 位置 c:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:行号 566
   在 ProtoBuf.Serializer.Deserialize[T](Stream source) 位置 c:\Dev\protobuf-net\protobuf-net\Serializer.cs:行号 77
   在 Serialize.ProtobufSerializer.DeSerialize[T](String content) 位置 E:\WorkSpace\WorkSpaceTest\CompressTest\Serialize\ProtobufSerializer.cs:行号 40
   在 Serialize.Form1.button1_Click(Object sender, EventArgs e) 位置 E:\WorkSpace\WorkSpaceTest\CompressTest\Serialize\Form1.cs:行号 44
---------------------------
确定   
---------------------------
测试代码: 点击打开链接

C#中Encoding.Unicode与Encoding.UTF8的区别

小注:

本文参考:

序列化悍将Protobuf-Net,入门动手实录
8 种提升 ASP.NET Web API 性能的方法

  相对于XML、二进制序列化方式,Protobuf效率较高,支持数据量较大
protobuf序列化后的大小是json的1/10,xml格式的1/20,是二进制序列化的1/10

相关文章
|
C#
WPF中实现多选ComboBox控件
原文:WPF中实现多选ComboBox控件 在WPF中实现带CheckBox的ComboBox控件,让ComboBox控件可以支持多选。 将ComboBox的ItemsSource属性Binding到一个Book的集合, public class Book { ...
4094 0
|
存储 Linux Docker
Docker 更新版本
Docker 更新版本原来版本 1.10 更新后的版本 19.03.1 更新 Docker 版本需要注意的问题: 注意系统是否支持新版本的储存驱动。 19.03.01 版本默认使用的储存驱动是 overlay2。
3404 0
|
9月前
|
监控 前端开发 JavaScript
React + TypeScript 最佳实践:构建高可维护前端项目
本文系统梳理了 React + TypeScript 高可维护项目的最佳实践,涵盖项目结构、类型设计、组件模式、自定义 Hook、状态管理、API 服务、性能优化及测试部署等全链路方案,助力构建高质量企业级前端应用。
844 4
|
7月前
|
缓存 JSON Java
如何编程调用IP查询API?(PythonJava等示例)
本文从开发者视角分享如何在实际项目中集成IP数据云API,涵盖Python与Java调用示例,详解接口封装、异常处理、缓存设计等工程实践要点,助力登录风控、反作弊等系统高效构建。
|
8月前
|
监控 Linux API
C#实现USB数据收发
C#实现USB数据收发
380 5
|
8月前
|
网络协议 API 定位技术
全球IP归属地查询免费API详细指南
接口盒子提供免费全球IP归属地查询API,支持IPv4/IPv6,返回国家、省、市、运营商及经纬度等详细信息。多通道查询保障准确性,无每日调用上限,适用于网站分析、安全防护、内容本地化等场景。
2139 0
|
缓存 网络协议 测试技术
NFS挂载信息如何调整?
NFS挂载信息如何调整?
1237 3
|
JavaScript 前端开发 网络安全
【网络安全 | 信息收集】JS文件信息收集工具LinkFinder安装使用教程
【网络安全 | 信息收集】JS文件信息收集工具LinkFinder安装使用教程
2201 4
|
存储 关系型数据库 数据库
华为数据库openGauss与PostgreSQL使用对比
华为openGauss数据库基于PostgreSQL内核演进,进行了多项增强。密码认证从MD5升级为SHA256;字符串存储中,char(n)、varchar(n)的n由字符改为字节,新增nvarchar2(n)表示字符,最大存储100MB;且将空字符&#39;&#39;统一转换为null,提升了数据处理的一致性和安全性。
1412 12
|
机器学习/深度学习 存储 人工智能
【AI系统】模型剪枝
本文概述了模型剪枝的概念、方法及流程,旨在通过移除神经网络中冗余或不重要的参数,实现模型规模的减小和效率的提升。剪枝不仅有助于降低模型的存储和计算需求,还能增强模型的泛化能力。文章详细介绍了剪枝的定义、分类、不同阶段的剪枝流程,以及多种剪枝算法,如基于参数重要性的方法、结构化剪枝、动态剪枝和基于优化算法的全局剪枝策略。通过这些方法,可以在保持模型性能的同时,显著提高模型的计算速度和部署灵活性。
1872 2
【AI系统】模型剪枝

热门文章

最新文章