编辑:序列化的一种工作方式是使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(或 IFormatter 的其他实现)。要序列化对象,您需要传递对象和流。要反序列化对象,请传递一个流(位于序列化数据的开头),它会返回序列化对象及其所有依赖项。
public static class EntityBackupServices
{
public static MemoryStream Backup (BaseEntity entity)
{
var ms = new MemoryStream();
Serialize (ms, entity);
ms.Position = 0;
return ms;
}
public static void Serialize (Stream stream, BaseEntity entity)
{
var binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize (stream, entity);
}
public static BaseEntity Restore (Stream stream)
{
var binaryFormatter = new BinaryFormatter();
var entity = (BaseEntity) binaryFormatter.Deserialize (stream);
return entity;
}
}
格式化程序不做的一件事(尽管 FormatterServices 类使之成为可能)是修改现有对象。因此,您可能不希望有一个名为 Deserialize 的实例方法。你不能这样做:new LionEntity().Deserialize () 替换现有实例的字段。
注意:您需要将Serializable 放在所有类型上。任何不能被序列化的字段(因为它要么不是结构,要么没有被标记为 [Serializable] 将需要用NonSerialized 标记。
// A test object that needs to be serialized.
[Serializable()]
public class BaseEntity
{
public int member1;
public string member2;
public string member3;
public double member4;
// A field that is not serialized.
[NonSerialized()] public MyRuntimeType memberThatIsNotSerializable;
public TestSimpleObject()
{
member1 = 11;
member2 = "hello";
member3 = "hello";
member4 = 3.14159265;
memberThatIsNotSerializable = new Form ();
}
public MemoryStream Backup ()
{
return EntityBackupServices.Backup (this);
}
}
编辑:
我提到的方式是一种相当标准且被接受的方式。如果您想冒险进入 hackdom,您可以按照我提到的方式反序列化对象,然后使用反射将现有对象上的每个字段设置为反序列化对象的值。
public class BaseEntity
{
void Restore(Stream stream)
{
object deserialized = EntityBackupServices.RestoreDeserialize(stream);//As listed above
if (deserialized.GetType () != this.GetType ())
throw new Exception();
foreach (FieldInfo fi in GetType().GetFields())
{
fi.SetValue(this, fi.GetValue (deserialized));
}
}
}