Windows Phone 7中的数据序列化

Windows Phone 7应用程序开发中,经常需要将对象序列化到存储设备中,以便在应用程序的不同会话之间持久化数据。序列化是将对象状态转换为可以存储或传输的格式的过程。在本文中,将探讨如何使用.NET框架中的DataContractSerializer类来序列化和反序列化对象。

Employee类的序列化

首先,定义一个简单的Employee类,该类包含员工编号、姓名和部门等属性。在序列化之前,需要确保类和属性都符合序列化的要求。

public class Employee { public int EmployeeNumber { get; set; } public string Name { get; set; } public string Department { get; set; } }

为了使Employee类能够被序列化,需要对其进行一些修改:

  1. 将类标记为public。
  2. 使用[DataContract]属性标记类。
  3. 使用[DataMember]属性标记需要序列化的属性。
[DataContract] public class Employee { [DataMember] public int EmployeeNumber { get; set; } [DataMember] public string Name { get; set; } [DataMember] public string Department { get; set; } }

此外,类应该有一个默认构造函数,如果没有显式定义,运行时会自动提供一个。

使用DataContractSerializer进行序列化和反序列化

一旦Employee类被正确标记,就可以创建一个DataContractSerializer实例来处理序列化和反序列化。

DataContractSerializer mySerializer = new DataContractSerializer(typeof(Employee));

DataContractSerializer可以序列化对象到流中,例如文件流、网络流或内存流。在本例中,将数据保存到文件流中。

创建通用数据保存类

为了简化序列化和反序列化过程,可以创建一个通用类DataSaver,它封装了序列化和反序列化的逻辑。

using System; using System.IO; using System.IO.IsolatedStorage; using System.Runtime.Serialization; public class DataSaver<MyDataType> { private const string TargetFolderName = "MyFolderName"; private DataContractSerializer _mySerializer; private IsolatedStorageFile _isoFile; public IsolatedStorageFile IsoFile { get { if (_isoFile == null) { _isoFile = IsolatedStorageFile.GetUserStoreForApplication(); } return _isoFile; } } public DataSaver() { _mySerializer = new DataContractSerializer(typeof(MyDataType)); } public void SaveMyData(MyDataType sourceData, string targetFileName) { string TargetFileName = String.Format("{0}/{1}.dat", TargetFolderName, targetFileName); if (!IsoFile.DirectoryExists(TargetFolderName)) { IsoFile.CreateDirectory(TargetFolderName); } try { using (var targetFile = IsoFile.CreateFile(TargetFileName)) { _mySerializer.WriteObject(targetFile, sourceData); } } catch (Exception e) { IsoFile.DeleteFile(TargetFileName); } } public MyDataType LoadMyData(string sourceName) { MyDataType retVal = default(MyDataType); string TargetFileName = String.Format("{0}/{1}.dat", TargetFolderName, sourceName); if (IsoFile.FileExists(TargetFileName)) { using (var sourceStream = IsoFile.OpenFile(TargetFileName, FileMode.Open)) { retVal = (MyDataType)_mySerializer.ReadObject(sourceStream); } } return retVal; } }

在上面的代码中,定义了一个泛型类DataSaver,它接受一个类型参数MyDataType。这个类使用DataContractSerializer来序列化和反序列化MyDataType类型的对象。

使用DataSaver类

要使用DataSaver类,只需创建其实例并传入要保存的对象以及文件名。

// 声明DataSaver<Employee>实例 DataSaver<Employee> myEmployeeDataSaver = new DataSaver<Employee>(); // 读取数据 var EmployeeData = myEmployeeDataSaver.LoadMyData("MyEmployeeDataFileName"); // 保存数据 myEmployeeDataSaver.SaveMyData(myEmployee, "MyEmployeeDataFileName");
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485