分享

ISerializable接口简析之二

 长江黄鹤 2018-05-14

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多