zoukankan      html  css  js  c++  java
  • .net中的对象序列化(2):三种序列化方式

    .Net框架中提供了3中序列化的方式, 分别是:

    • Binary Serializer
    • Soap Serializer
    • XML Serializer

    1. Binary Serializer

    如果需要序列化这个类的对象,那么这个类必须要标记为是可序列化的。需要用到特性 [Serializable] (作用域是Class, Struct, Enum, Delegate)

    如果某些变量不需要序列化, 或者不能序列化可以使用[NonSerialized], (作用域是Field)

    需要注意, 如果类中使用了其它的类属性,如果希望它们能序列化,那么其它的类也必须是可序列化的, 如下面类DethDisease

     1 namespace SerializationDemo 
     2 { 
     3     [Serializable] 
     4     public class Person 
     5     { 
     6         [NonSerialized] 
     7         private int _age;
     8         public int Age 
     9         { 
    10             get 
    11             { 
    12                 return _age; 
    13             } 
    14             set 
    15             { 
    16                 _age = value; 
    17             } 
    18         }
    19         public DethDisease Disease 
    20         { 
    21             get
    22             set
    23         }
    24         public string Medicine 
    25         { 
    26             get
    27             set
    28         }
    29         public Person() 
    30         { 
    31             Age = 0
    32         }
    33         public bool Live() 
    34         { 
    35             Age++; 
    36             if (Disease != null && !Disease.CanLive(Age, Medicine)) 
    37                 return false
    38             return true
    39         } 
    40     } 
    41 }

    二进制序列化的代码, 主要是这个BinaryFormatter.

    1 IFormatter formatter = new BinaryFormatter(); 
    2 Stream stream = new FileStream("Person", FileMode.Create, FileAccess.Write, FileShare.None); 
    3 formatter.Serialize(stream, newPerson); 
    4 stream.Close();

    反序列化

    1 IFormatter formatter = new BinaryFormatter(); 
    2 Stream stream = new FileStream("Person", FileMode.Open, FileAccess.Read, FileShare.Read); 
    3 newPerson = (Person)formatter.Deserialize(stream); 
    4 stream.Close();

    2. Soap Serializer

    基本和上面的一样,只是用到不同的IFormatter实现,SoapFormatter

    3. XML Serializer

    使用xml Serializer, 不需要使用特性[Serializable]

    使用xml Serializer, 有相关的一些其它特性来改变xml的输出结果。

    XmlRoot: 作用于类根元素, 控制根元素的输出

    XmlElement: 作用于类的属性或field

    XmlAttribute: 作为属性输出,而不是节点

    XmlIgnore: 不输出

    XmlText: 必须是字符串类型, 一个类中只能有一个这个特性, 没有标签包裹,也不作为属性

    XmlArray: 作用于数组类型, 可以控制数组的输出

    这里是常用的序列化xml的核心方法

     1 public static string XmlSerialize<T>(T obj) 
     2       { 
     3           string xmlString = string.Empty; 
     4           XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
     5           using (MemoryStream ms = new MemoryStream()) 
     6           { 
     7               xmlSerializer.Serialize(ms, obj); 
     8               xmlString = Encoding.UTF8.GetString(ms.ToArray()); 
     9           } 
    10           return xmlString; 
    11       }
    12       public static T XmlDeserialize<T>(string xmlString) 
    13       { 
    14           T t = default(T); 
    15           XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
    16           using (Stream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString))) 
    17           { 
    18               using (XmlReader xmlReader = XmlReader.Create(xmlStream)) 
    19               { 
    20                   Object obj = xmlSerializer.Deserialize(xmlReader); 
    21                   t = (T)obj; 
    22               } 
    23           } 
    24           return t; 
    25       }

    三种方式比较:

    Binary方式效率最高,可读性不如后两种好。

    Soap方式可以用于跨平台传输, xml方式简单易用,用于程序内部使用,灵活方便。

    相关源代码: SerializationDemo

  • 相关阅读:
    《C++反汇编与逆向分析技术揭秘》--构造函数 读书笔记
    《C++反汇编与逆向分析技术揭秘》--虚函数 读书笔记
    VPP-main() 源码学习
    【转】几种TCP连接中出现RST的情况
    动态追踪学习
    RCU学习总结
    内核栈回溯原理学习应用
    《C++反汇编与逆向分析技术揭秘》--单类继承 读书笔记
    C# 防火墙操作之创建规则
    C# 防火墙操作之特定程序
  • 原文地址:https://www.cnblogs.com/JustRun1983/p/2416775.html
Copyright © 2011-2022 走看看