您可以将序列化用于有组织的存储,而不是文本存储。
我正在附加静态类文件,其中包含将序列化和反序列化回原始对象的方法。
下载源代码
让我们举一个概括的例子。假设您有如下 Student 和 Mark 类:
/// <summary>
/// Provides structure for 'Student' entity
/// </summary>
/// 'DataContract' attribute is necessary to serialize object of following class. By removing 'DataContract' attribute, the following class 'Student' will no longer be serialized
[DataContract]
public class Student
{
[DataMember]
public ushort Id { get; set; }
[DataMember]
public string UserName { get; set; }
/// <summary>
/// Password has been marked as non-serializable by removing 'DataContract'
/// </summary>
// [DataMember] // Password will not be serialized. Uncomment this line to serialize password
public string Password { get; set; }
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public List<Mark> Marks { get; set; }
}
[DataContract]
public class Mark
{
[DataMember]
public string Subject { get; set; }
[DataMember]
public short Percentage { get; set; }
}
确保将“ [DataContract] ”属性分配给calss和“ [DataMember] ”属性分配给数据成员以序列化它们,否则在序列化对象时它们将被忽略
现在,要序列化和反序列化,您将拥有以下具有保存和加载功能的静态类:
/// <summary>
/// Provides functions to save and load single object as well as List of 'T' using serialization
/// </summary>
/// <typeparam name="T">Type parameter to be serialize</typeparam>
public static class SerializableStorage<T> where T : new()
{
public static async void Save(string FileName, T _Data)
{
MemoryStream _MemoryStream = new MemoryStream();
DataContractSerializer Serializer = new DataContractSerializer(typeof(T));
Serializer.WriteObject(_MemoryStream, _Data);
Task.WaitAll();
StorageFile _File = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName, CreationCollisionOption.ReplaceExisting);
using (Stream fileStream = await _File.OpenStreamForWriteAsync())
{
_MemoryStream.Seek(0, SeekOrigin.Begin);
await _MemoryStream.CopyToAsync(fileStream);
await fileStream.FlushAsync();
fileStream.Dispose();
}
}
public static async Task<T> Load(string FileName)
{
StorageFolder _Folder = ApplicationData.Current.LocalFolder;
StorageFile _File;
T Result;
try
{
Task.WaitAll();
_File = await _Folder.GetFileAsync(FileName);
using (Stream stream = await _File.OpenStreamForReadAsync())
{
DataContractSerializer Serializer = new DataContractSerializer(typeof(T));
Result = (T)Serializer.ReadObject(stream);
}
return Result;
}
catch (Exception ex)
{
return new T();
}
}
}
现在,让我们看看如何存储 Student 的对象并从文件中检索它:
/* Create an object of Student class to store */
Student s1 = new Student();
s1.Id = 1;
s1.UserName = "Student1";
s1.Password = "Student123";
s1.FirstName = "Abc";
s1.LastName = "Xyz";
s1.Marks = new List<Mark>();
/* Create list of Marks */
Mark m1 = new Mark();
m1.Subject = "Computer";
m1.Percentage = 89;
Mark m2 = new Mark();
m2.Subject = "Physics";
m2.Percentage = 92;
/* Add marks into Student object */
s1.Marks.Add(m1);
s1.Marks.Add(m2);
/* Store Student object 's1' into file 'MyFile1.dat' */
SerializableStorage<Student>.Save("MyFile1.dat", s1);
/* Load stored student object from 'MyFile1.dat' */
Student s2 = await SerializableStorage<Student>.Load("MyFile1.dat");
您可以序列化和反序列化任何类。要存储'Student'以外的类的对象,假设'MyClass',只需将函数的'T'参数中的Student类型替换为如下:
/* Store MyClass object 's1' into file 'MyFile1.dat' */
SerializableStorage<MyClass>.Save("MyFile1.dat", s1);
/* Load stored MyClass object from 'MyFile1.dat' */
MyClass s2 = await SerializableStorage<MyClass>.Load("MyFile1.dat");
注意:“MyFile1.dat”将存储在“ ApplicationData.Current.LocalFolder ”中。此代码在 Windows 10 IoT Core (10.0.10586.0) 上进行了测试,可以在任何 UWP 应用上运行。
下载源代码