在Windows Phone 7应用程序开发中,经常需要将对象序列化到存储设备中,以便在应用程序的不同会话之间持久化数据。序列化是将对象状态转换为可以存储或传输的格式的过程。在本文中,将探讨如何使用.NET框架中的DataContractSerializer类来序列化和反序列化对象。
首先,定义一个简单的Employee类,该类包含员工编号、姓名和部门等属性。在序列化之前,需要确保类和属性都符合序列化的要求。
public class Employee
{
public int EmployeeNumber { get; set; }
public string Name { get; set; }
public string Department { get; set; }
}
为了使Employee类能够被序列化,需要对其进行一些修改:
[DataContract]
public class Employee
{
[DataMember]
public int EmployeeNumber { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Department { get; set; }
}
此外,类应该有一个默认构造函数,如果没有显式定义,运行时会自动提供一个。
一旦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<Employee>实例
DataSaver<Employee> myEmployeeDataSaver = new DataSaver<Employee>();
// 读取数据
var EmployeeData = myEmployeeDataSaver.LoadMyData("MyEmployeeDataFileName");
// 保存数据
myEmployeeDataSaver.SaveMyData(myEmployee, "MyEmployeeDataFileName");