为我们无权访问的密封 class 定义 serialization/deserialization 方法
Define serialization/deserialization method for a sealed class that we do not have access
我有一个 class,它有一些 public 成员,其中包含一些关于当前应用程序状态的数据。我使用的框架定义了一些未标记为可序列化的数据结构 - 让我们以 Vector3 为例。
当我尝试序列化我的程序数据时,出现错误 - Vector3 未标记为可序列化。
[System.Serializable]
public class ProgramData
{
public Vector3 test;
public bool test2;
}
我可以为此定义我自己的序列化 class 来绕过这个问题 -
[System.Serializable]
public class ProgramData : ISerializable
{
public Vector3 test;
public bool test2;
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("testx", test.x);
info.AddValue("testy", test.y);
info.AddValue("testz", test.z);
info.AddValue("test2", test2);
}
protected ProgramData(SerializationInfo si,
StreamingContext context)
{
test = new Vector3((float)si.GetDouble("testx"), (float)si.GetDouble("testy"), (float)si.GetDouble("testz"));
test2 = si.GetBoolean("test2");
}
}
这工作正常,但维护起来很痛苦,因为现在我必须告诉它如何 serialize/deserialize 整个 class - 我必须维护 GetObjectData 和受保护的构造方法当我扩展我的数据时 class。这是行不通的。
相反,我想告诉我的程序如何反序列化“Vector3”,并让它在遇到 Vector3 时使用这些指令。
一种可能的方法是创建一个新的 class 用作 Vector3 实例的包装器。这个包装器 class,我们称之为 Vector3W,实现为可序列化的,saves/restores 是底层 Vector3 实例。添加一些 properties/methods 到模仿底层 Vector3 的 properties/methods 的包装器,并通过简单地调用该底层实例来实现。然后,您只需将 Vector3 的每个实例替换为 Vector3W 并知道它会正确保留。
我有一个 class,它有一些 public 成员,其中包含一些关于当前应用程序状态的数据。我使用的框架定义了一些未标记为可序列化的数据结构 - 让我们以 Vector3 为例。
当我尝试序列化我的程序数据时,出现错误 - Vector3 未标记为可序列化。
[System.Serializable]
public class ProgramData
{
public Vector3 test;
public bool test2;
}
我可以为此定义我自己的序列化 class 来绕过这个问题 -
[System.Serializable]
public class ProgramData : ISerializable
{
public Vector3 test;
public bool test2;
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("testx", test.x);
info.AddValue("testy", test.y);
info.AddValue("testz", test.z);
info.AddValue("test2", test2);
}
protected ProgramData(SerializationInfo si,
StreamingContext context)
{
test = new Vector3((float)si.GetDouble("testx"), (float)si.GetDouble("testy"), (float)si.GetDouble("testz"));
test2 = si.GetBoolean("test2");
}
}
这工作正常,但维护起来很痛苦,因为现在我必须告诉它如何 serialize/deserialize 整个 class - 我必须维护 GetObjectData 和受保护的构造方法当我扩展我的数据时 class。这是行不通的。
相反,我想告诉我的程序如何反序列化“Vector3”,并让它在遇到 Vector3 时使用这些指令。
一种可能的方法是创建一个新的 class 用作 Vector3 实例的包装器。这个包装器 class,我们称之为 Vector3W,实现为可序列化的,saves/restores 是底层 Vector3 实例。添加一些 properties/methods 到模仿底层 Vector3 的 properties/methods 的包装器,并通过简单地调用该底层实例来实现。然后,您只需将 Vector3 的每个实例替换为 Vector3W 并知道它会正确保留。