序列化与反序列化

Posted henryblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化与反序列化相关的知识,希望对你有一定的参考价值。

序列化与反序列化对比

1、常用的优秀序列化使用方式

Newtonsoft.Json

//object => string
JsonConvert.SerializeObject(object? value);
//string => object
JsonConvert.DeserializeObject(string value);

2、性能更好的序列化方式

转化为二进制

//将Object类型对象(注:必须是可序列化的对象)转换为二进制序列字符串
public static string SerializeObject(object obj)
{
    IFormatter formatter = new BinaryFormatter();
    string result = string.Empty;
    using (MemoryStream stream = new MemoryStream())
    {
        formatter.Serialize(stream, obj);
        byte[] byt = new byte[stream.Length];
        byt = stream.ToArray();
        //result = Encoding.UTF8.GetString(byt, 0, byt.Length);
        result = Convert.ToBase64String(byt);
        stream.Flush();
    }
    return result;
}
//将二进制序列字符串转换为Object类型对象
public static object DeserializeObject(string str)
{
    IFormatter formatter = new BinaryFormatter();
    //byte[] byt = Encoding.UTF8.GetBytes(str);
    byte[] byt = Convert.FromBase64String(str);
    object obj = null;
    using (Stream stream = new MemoryStream(byt, 0, byt.Length))
    {
        obj = formatter.Deserialize(stream);
    }
    return obj;
}

注意!!

1、使用二进制序列化必须是可序列化的对象

2、使用自创的对象或集合 必须在model上面加上 [Serializable] 特性

要让一个对象支持.Net序列化服务,用户必须为每一个关联的类加上[Serializable]特性。如果类中有些成员不适合参与序列化(比如:密码字段),可以在这些域前加上[NonSerialized]特性。

即报错(“******, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null‘ is not marked as serializable.”)的解决方法

 

测试对比

集合序列化和反序列化执行1000次耗费时间

技术图片

 说明:

1、序列化为二进制字符串明显快很多

2、优缺点

Newtonsoft.Json 方便使用 性能也还可以

二进制序列化 需要配置序列化 转为object的对象还要强转类型

 

参考

 序列化化二进制   -- https://www.cnblogs.com/leizhui/p/11750415.html

 其他序列化  -- https://www.cnblogs.com/binye/articles/9863712.html

以上是关于序列化与反序列化的主要内容,如果未能解决你的问题,请参考以下文章

GolangGo 语言 JSON 的序列化与反序列化实践

GolangGo 语言 JSON 的序列化与反序列化实践

GolangGo 语言 JSON 的序列化与反序列化实践

Serializable详解:代码验证Java序列化与反序列化

php中序列化与反序列化

Java对象操作流:序列化与反序列化