学习.NET(7) ISerializable接口简析之二

原创 2008年10月02日 11:44:00

上一篇"学习.NET(6) ISerializable接口简析"中已经分析过如何把Serializable的对象保存到MemoryStream中。通过BitFormatter可以很轻易的把MemoryStream保存为二进制数组中,无论是存为二进制文件,还是保存在数据库等可以存储数据的地方,以便将来可以轻易的Deserialize。当然二进制数据Byte[]总是不方便使用,可以UnicodeEncoding,BitConverter等辅助类可以很容易的把上述二进制数据转化为String,同样可以进行存储以便将来使用。

然而,除了上述方法之外,还有另外一种选择:保存数据到XML文件。

要指定一个Class可以被存储到XML文件,首先要为该Class应用DataContractAttribute。同时为需要保存的Field应用DataMemberAttribute。特别的是,为了Enum数据,可以应用EnumMemberAttribute属性。

以下为简单的测试代码(根据MSDN的示例代码修改而来):

  1. [DataContract]
  2. internal enum DisplayLanguage
  3. {
  4.     [EnumMember(Value = "EN")]        
  5.     English = 0,
  6.     [EnumMember(Value = "CN")]
  7.     Chinese = 1,
  8. [DataContract(Name = "Customer", Namespace = "http://www.google.com")]
  9. class TESTData : IExtensibleDataObject
  10. {
  11.     private String strFirst = null;
  12.     private Int32? nTest = null
  13.     [DataMember()]
  14.     public string FirstName
  15.     {
  16.         get { return strFirst; }
  17.         set { strFirst = value; }
  18.     }
  19.     [DataMember]
  20.     public string LastName;
  21.     [DataMember()]
  22.     public int ID;
  23.     [DataMember()]
  24.     public DisplayLanguage CellDisplay;
  25.     [DataMember()]
  26.     public Int32? TestNumber
  27.     {
  28.         get { return nTest; }
  29.         set { nTest = value; }
  30.     }
  31.     [DataMember()]
  32.     public List<String> listValues = new List<string>(); 
  33.     public TESTData(string newfName, string newLName, int newID, DisplayLanguage ds)
  34.     {
  35.         FirstName = newfName;
  36.         LastName = newLName;
  37.         ID = newID;
  38.         CellDisplay = ds;
  39.         nTest = null;
  40.         listValues.Add("TEST");
  41.         listValues.Add("Test2");
  42.     } 
  43.     private ExtensionDataObject extensionData_Value; 
  44.     public ExtensionDataObject ExtensionData
  45.     {
  46.         get
  47.         {
  48.             return extensionData_Value;
  49.         }
  50.         set
  51.         {
  52.             extensionData_Value = value;
  53.         }
  54.     }

以上代码中,我不仅使用了Enum数据,同时使用了Int32?即Nullable<Int32>类型;以及List<String>类型。

以下是测试代码:

  1. public sealed class Test
  2. {
  3.     private Test() { } 
  4.     public static void Main()
  5.     {
  6.         try
  7.         {
  8.             WriteObject("DataContractSerializerExample.xml");
  9.             ReadObject("DataContractSerializerExample.xml"); 
  10.         } 
  11.         catch (SerializationException serExc)
  12.         {
  13.             Console.WriteLine("Serialization Failed");
  14.             Console.WriteLine(serExc.Message);
  15.         }
  16.         catch (Exception exc)
  17.         {
  18.             Console.WriteLine(
  19.             "The serialization operation failed: {0} StackTrace: {1}",
  20.             exc.Message, exc.StackTrace);
  21.         } 
  22.         finally
  23.         {
  24.             Console.WriteLine("Press <Enter> to exit....");
  25.             Console.ReadLine();
  26.         }
  27.     } 
  28.     public static void WriteObject(string fileName)
  29.     {
  30.         Console.WriteLine(
  31.             "Creating a Person object and serializing it.");
  32.         TESTData p1 = new TESTData("Zighetti""Barbara", 101, DisplayLanguage.Chinese);
  33.         p1.FirstName = "Madrid";
  34.         p1.TestNumber = 5;
  35.         FileStream writer = new FileStream(fileName, FileMode.Create);
  36.         DataContractSerializer ser =
  37.             new DataContractSerializer(typeof(TESTData));
  38.         ser.WriteObject(writer, p1);
  39.         writer.Close();
  40.     } 
  41.     public static void ReadObject(string fileName)
  42.     {
  43.         Console.WriteLine("Deserializing an instance of the object.");
  44.         FileStream fs = new FileStream(fileName,
  45.         FileMode.Open);
  46.         XmlDictionaryReader reader =
  47.             XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
  48.         DataContractSerializer ser = new DataContractSerializer(typeof(TESTData)); 
  49.         // Deserialize the data and read it from the instance.
  50.         TESTData deserializedPerson =
  51.             (TESTData)ser.ReadObject(reader, true);
  52.         reader.Close();
  53.         fs.Close();
  54.         Console.WriteLine(String.Format("{0} {1}, ID: {2}, Display: {3}, Test: {4}",
  55.         deserializedPerson.FirstName, deserializedPerson.LastName,
  56.         deserializedPerson.ID, deserializedPerson.CellDisplay, deserializedPerson.TestNumber == null"NULL" : deserializedPerson.TestNumber.Value.ToString()));
  57.     } 

看看生成的XML文件:

  1. <Customer xmlns="http://www.google.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><CellDisplay>CN</CellDisplay><FirstName>Madrid</FirstName><ID>101</ID><LastName>Barbara</LastName><TestNumber>5</TestNumber><listValues xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:string>TEST</a:string><a:string>Test2</a:string></listValues></Customer>
版权声明:© 2004 - 2016 Alva Chien, All Rights Reserved.

Android上Bitmap文件解析示例

本文主要介绍的是Bitmap文件解析的一个简单示例,例子是在Androd上写的,用到的图像只有24位深度的这一种。Bitmap文件的基本结构参考: http://www.cnblogs.com/je...
  • smileorcryps
  • smileorcryps
  • 2017年03月07日 11:22
  • 190

leaf开源服务器第二节-分析之配置文件说明及服务器运行

leaf开源服务器第一节-分析项目结构 大家好 我是社区主编彬哥,今天继续分析leaf服务器;我们上节课给大家简单的介绍了leaf 服务器的项目结构,本节给大家代码的是服务器配置文件server.j...
  • QQ1528884535
  • QQ1528884535
  • 2017年11月08日 16:38
  • 60

抽象类和接口简析

前言接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他们...
  • nanhaierbuku
  • nanhaierbuku
  • 2017年12月20日 08:50
  • 30

java 生成二维码原理分析

java生成二维码原理
  • kechuangww
  • kechuangww
  • 2015年04月29日 16:29
  • 249

chatofpomelo简析之二——聊天

上一篇ChatofPomelo简析之一——用户登录分析客户端登陆的过程。当用户登陆成功后,聊天又是个什么过程呢?下面就来分析聊天时,客户端与服务器端的交互过程。 客户端 我们先来看看下,聊...
  • aa294194253
  • aa294194253
  • 2014年11月07日 09:38
  • 444

chatofpomelo简析之二——聊天

客户端 我们先来看看下,聊天发送消息的过程。当用户在文本框内输入文字,并回车就可以发送消息了   1: $("#entry").keypress(function (e) {  ...
  • hm2462964492
  • hm2462964492
  • 2014年07月29日 11:35
  • 778

EMV技术学习和研究

今天在工作中碰到一些问题,就找到了这篇关于EMV/PBOC的文章,个人感觉很好,保存下来,以供随时学习。...
  • duozh
  • duozh
  • 2016年01月06日 22:53
  • 487

卡尔曼滤波算法的基本原理实例解析

卡尔曼滤波器,算法
  • lu_mingzhi
  • lu_mingzhi
  • 2016年12月06日 21:17
  • 905

Android启动过程深入解析

当按下Android设备电源键时究竟发生了什么?Android的启动过程是怎么样的?什么是Linux内核?桌面系统linux内核与Android系统linux内核有什么区别?什么是引导装载程序?什么是...
  • fishmai
  • fishmai
  • 2017年06月03日 22:42
  • 283

简析关于Set接口的各种操作

西安达内简析关于Set接口的各种操作,size方法返回Set中元素的数目。如果这个元素不存在于集合中,并且返回一个布尔值标识的元素是否成功添加。remove方法从Set中移除指定的元素,如果这个元素存...
  • u010251981
  • u010251981
  • 2013年05月08日 19:58
  • 274
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习.NET(7) ISerializable接口简析之二
举报原因:
原因补充:

(最多只允许输入30个字)