C# Protobuf-Net 序列化

衣舞晨風發表於2015-11-09

原始碼位置: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

作者:jiankunking 出處:http://blog.csdn.net/jiankunking


相關文章