zoukankan      html  css  js  c++  java
  • c#序列化和反序列化

    序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件 中。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或者和其它应用程序共享使用。反之,反序列化根据流重新构造对象。  

    一、序列化的方式

    1)二进制序列化:是一种将数据写到输出流,以使它能够用来自动重构成相应对象的机制。二进制,其名字就暗示它的必要信息是保存在存储介质上,而这些必要信息要求创建一个对象的精确的二进制副本。在二进制(流)序列化中,整个对象的状态都被保存起来,而XML序列化只有部分数据被保存起来。

    string strobj = "serialization";
    FileStream stream = new FileStream("C:\Users\Jing\Desktop\11.txt", FileMode.Create, FileAccess.Write,FileShare.None);
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, strobj);
    stream.Close();
    
    FileStream readstream = new FileStream("C:\Users\Jing\Desktop\11.txt", FileMode.Open, FileAccess.Read,
    FileShare.Read);
    string readdata = (string)formatter.Deserialize(readstream);
    readstream.Close();
    Console.WriteLine(readdata);
    Console.ReadLine();

    2)SOAP协议是一个在异构的应用程序之间进行信息交互的理想的选择。我们需要在应用程序中添加System.Runtime.Serialization.Formatters.Soap名字空间以便在.Net中使用SOAP序列化SOAP序列化的主要优势在于可移植性。SoapFormatter把对象序列化成SOAP消息或解析SOAP消息并重构被序列化的对象。

    string strobj = "serialization";
    FileStream stream = new FileStream("C:\Users\Jing\Desktop\11.txt", FileMode.Create, FileAccess.Write ,FileShare.None);
    SoapFormatter formatter = new SoapFormatter();
    formatter.Serialize(stream, strobj);
    stream.Close();
    
    FileStream readstream = new FileStream("C:\Users\JingWang\Desktop\11.txt", FileMode.Open , FileAccess.Read ,
    FileShare.Read );
    string readdata = (string)formatter.Deserialize(readstream);
    readstream.Close();
    Console.WriteLine(readdata);
    Console.ReadLine();

    3)XML序列化:将一个对象或参数的公开字段和属性以及方法的返回值转换(序列化)成遵循XSD文档标准的XML流。因为XML是一个开放的标准,XML能被任何需要的程序处理,而不管在什么平台下,因此XML序列化被用到带有公开的属性和字段的强类型类中,它的这些发生和字段被转换成序列化的格式(在这里是XML)存储或传输。”添加System.XML.Serialization引用以使用XML序列化。使用XML序列化的基础是XmlSerializer

    string strobj = "test string for serialization";
    FileStream stream = new FileStream("C:\Users\Jing\Desktop\11.txt", FileMode.Create, FileAccess.Write ,FileShare.None);
    XmlSerializer  xmlserializer = new XmlSerializer(typeof(string));
    xmlserializer.Serialize(stream, strobj);
    stream.Close();
    
    
    FileStream readstream = new FileStream("C:\Users\Jing\Desktop\11.txt", FileMode.Open , FileAccess.Read ,FileShare.Read );
    string readdata = (string)xmlserializer.Deserialize(readstream);
    Console.WriteLine(readdata);
    Console.ReadLine();

    4)Json序列化:

    string strobj = "test string for serialization";
    FileStream stream = new FileStream("C:\Users\Jing\Desktop\11.txt", FileMode.Create, FileAccess.Write,FileShare.None);
    DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(string));
    formatter.WriteObject(stream, strobj);
    stream.Close();
    
    FileStream readstream = new FileStream("C:\Users\Jing\Desktop\11.txt", FileMode.Open, FileAccess.Read,FileShare.Read);
    string readdata = (string)formatter.ReadObject(readstream);
    readstream.Close();
    Console.WriteLine(readdata);
    Console.ReadLine();

    在C#中,如果想要进行自定义类的序列化,只需要简单地在定义类的时候添加Serializable标签即可。除非类的成员标记了[NonSerializable],序列化会将类中的所有成员都序列化。

    [Serializable]
    public class Person
    {
        public string name;
        public int age;
    }

    二、.NET对象和JSON对象之间的转化-JSON.NET

    使用JSONSerializer可以非常方便的实现.NET对象与Json数据之间的转化,JSONSerializer会把.NET对象的属性名转化为Json数据中的Key,把对象的属性值转化为Json数据中的value。示例:

    Product product = new Product();
    product.Name = "Apple";
    product.Price = 3.99M;
    var deserialize= JsonConvert.DeserializeObject<Product>(urlToJson);
    var serialize= JsonConvert.SerializeObject(Product);
  • 相关阅读:
    Nginx服务器环境搭建
    PostgreSQL常见问题处理方法
    Linux之awk使用
    PostgreSQL常用SQL
    用apache commons-pool2建立thrift连接池
    redis开发小结
    如何解决netty发送消息截断问题
    后端服务开发总结
    利用git reflog找回错误的重置
    TCP长链接调试利器nc
  • 原文地址:https://www.cnblogs.com/qqvvn/p/9966950.html
Copyright © 2011-2022 走看看