为我们无权访问的密封 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 并知道它会正确保留。