用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
alvachien的公告
You will go through tough times, it's about coming through that.
文章分类
Alva Chien's Websites
Alva Chien's Photos
Always Dreaming of Something (else) - an Alva Chien's Blog
IT名人堂
Charles Petzold's Personal Website (Author of [Programming Windows])
Martin Fowler's Personal WebSite (Author of [Refactor])
潘爱民的专栏 (个人非常尊敬的一位大师,他翻的书让我可以不读原版, 现已加盟Microsoft)
芮祥麟的专栏(SAP Labs China的老大)
MFC/.Net网站荟萃
CodeGuru
CodeProject
GotDotNet - The Microsoft .NET Framework Community
MSDN
SQL Server Compact Edition
The Official Microsoft ASP.Net Site
The Synchronizer
WindowsClient.net: Windows Forms, Windows Presentation Foundation
顶尖IT公司
Accenture
HP
IBM
Intel
Microsoft Corp.
SAP AG
中国著名大学
上海交通大学
中国科学技术大学
北京大学
南京大学
南开大学
同济大学
复旦大学
浙江大学
清华大学
存档

原创  学习.NET(7) ISerializable接口简析之二 收藏

上一篇"学习.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>

发表于 @ 2008年10月02日 11:44:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:学习.NET (6) ISerializable接口简析 | 新一篇:学习.NET (8) 实现派生类中Deep Copy的几种常用方法(通过ICloneable接口)

  • 发表评论
  • 评论内容:
  •  
Copyright © alvachien
Powered by CSDN Blog