Редактировать: один из способов сериализации может работать - это использовать 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 поверх всехваши типы.Любые поля, которые нельзя сериализовать (поскольку они не являются структурой или не помечены как [Сериализуемые], должны быть помечены 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);
}
}
Редактировать:способ, который я упомянул, является довольно стандартным и общепринятым. Если вы хотите заняться хакдомом, вы можете десериализовать объект так, как я упомянул, а затем использовать отражение, чтобы установить для каждого поля вашего существующего объекта значение десериализованногообъект.
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));
}
}
}