.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


Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名justrun(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言


本文转自JustRun博客园博客,原文链接:http://www.cnblogs.com/JustRun1983/archive/2012/03/25/2416775.html,如需转载请自行联系原作者

相关文章
|
2月前
|
JSON Java API
GSON 泛型对象反序列化解决方案
GSON 泛型对象反序列化解决方案
|
8月前
|
存储 JSON 运维
PowerShell / 运维PowerShell 对象的序列化和反序列化
本文介绍Powershell中如何实现对象的序列化和反序列化。
85 0
|
8月前
|
容器
.NET Core-作用域与对象释放行为详解
.NET Core-作用域与对象释放行为详解
|
4月前
|
分布式计算 Java 大数据
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
53 0
|
2月前
|
JSON Android开发 数据格式
android 使用GSON 序列化对象出现字段被优化问题解决方案
android 使用GSON 序列化对象出现字段被优化问题解决方案
|
3月前
|
vr&ar
MFC序列化及反序列化对象
MFC序列化及反序列化对象
18 0
|
8月前
|
NoSQL Java Redis
[已解决]报异常java.io.InvalidClassException的解决方法|对象序列化实现Serializable会出现java.io.InvalidClassException的异常
[已解决]报异常java.io.InvalidClassException的解决方法|对象序列化实现Serializable会出现java.io.InvalidClassException的异常
|
4月前
|
存储 JSON 运维
PowerShell 对象的序列化和反序列化
PowerShell 对象的序列化和反序列化
40 0
|
4月前
|
C#
.NET开发中合理使用对象映射库,简化和提高工作效率
.NET开发中合理使用对象映射库,简化和提高工作效率
|
5月前
|
缓存 NoSQL Java
Spring Data Redis对象缓存序列化问题
在使用 Redis 时,有没有遇到同我一样,对象缓存序列化问题的呢?
71 6
Spring Data Redis对象缓存序列化问题