zoukankan      html  css  js  c++  java
  • C# 使用 protobuf 进行对象序列化与反序列化

    protobuf 是 google的一个开源项目,可用于以下两种用途:

    (1)数据的存储(序列化和反序列化),类似于xml、json等;

    (2)制作网络通信协议。

      源代码下载地址:https://github.com/mgravell/protobuf-net;

      开源项目地址如下:https://code.google.com/p/protobuf-net/。

    protobuf 工具类 DataUtils.cs 代码如下:

    nuget 包

    Install-Package ServiceStack.ProtoBuf -Version 5.1.0
    using System;
    using System.IO;
    using ProtoBuf;
    
    namespace nugetdll
    {
        public class DataUtils
        {
            public static byte[] ObjectToBytes<T>(T instance)
            {
                try
                {
                    byte[] array;
                    if (instance == null)
                    {
                        array = new byte[0];
                    }
                    else
                    {
                        MemoryStream memoryStream = new MemoryStream();
                        Serializer.Serialize(memoryStream, instance);
                        array = new byte[memoryStream.Length];
                        memoryStream.Position = 0L;
                        memoryStream.Read(array, 0, array.Length);
                        memoryStream.Dispose();
                    }
    
                    return array;
    
                }
                catch (Exception ex)
                {
    
                    return new byte[0];
                }
            }
    
            public static T BytesToObject<T>(byte[] bytesData, int offset, int length)
            {
                if (bytesData.Length == 0)
                {
                    return default(T);
                }
                try
                {
                    MemoryStream memoryStream = new MemoryStream();
                    memoryStream.Write(bytesData, 0, bytesData.Length);
                    memoryStream.Position = 0L;
                    T result = Serializer.Deserialize<T>(memoryStream);
                    memoryStream.Dispose();
                    return result;
                }
                catch (Exception ex)
                {
                    return default(T);
                }
            }
        }
    
        [ProtoContract]
        public class Test
        {
            [ProtoMember(1)]
            public string S { get; set; }
    
            [ProtoMember(2)]
            public string Type { get; set; }
    
            [ProtoMember(3)]
            public int I { get; set; }
    
            /// <summary>
            /// 默认构造函数必须有,否则反序列化会报 No parameterless constructor found for x 错误!
            /// </summary>
            public Test() { }
    
            public static Test Data => new Test
            {
                I = 222,
                S = "xxxxxx",
                Type = "打开的封口费"
            };
        }
    }
  • 相关阅读:
    hdu--1018--Big Number(斯特林公式)
    NYOJ--56--阶乘因式分解(一)
    hdu--1711--kmp应用在整形数组--Number Sequence
    HDU--1358--KMP算法失配函数getfail()的理解--Period
    C++STL(vector,map,set,list,bitset,deque)成员函数整理
    NYOJ--95--multiset--众数问题
    NYOJ--86--set.find()--找球号(一)
    NYOJ--19--next_permutation()--擅长排列的小明
    NYOJ--714--Card Trick
    NYOJ--2--括号配对问题
  • 原文地址:https://www.cnblogs.com/liuxiaoji/p/9517635.html
Copyright © 2011-2022 走看看