【问题标题】:Define serialization/deserialization method for a sealed class that we do not have access为我们无权访问的密封类定义序列化/反序列化方法
【发布时间】:2015-04-11 05:46:19
【问题描述】:

我有一个包含一些公共成员的类,其中包含有关当前应用程序状态的一些数据。我使用的框架定义了一些未标记为可序列化的数据结构 - 让我们以 Vector3 为例。

当我尝试序列化我的程序数据时,出现错误 - Vector3 未标记为可序列化。

[System.Serializable]
public class ProgramData
{
    public Vector3 test;
    public bool test2;

}

我可以为这个类定义我自己的序列化来解决这个问题 -

[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");
    }
}

这很好用,但维护起来很痛苦,因为现在我必须告诉它如何序列化/反序列化整个类 - 我必须在扩展数据类时维护 GetObjectData 和受保护的构造方法。这是不切实际的。

相反,我想告诉我的程序如何反序列化“Vector3”,并让它在遇到 Vector3 时使用这些指令。

【问题讨论】:

    标签: c# serialization binaryformatter


    【解决方案1】:

    一种可能的方法是创建一个新类,用作 Vector3 实例的包装器。这个包装类,我们称之为 Vector3W,实现为可序列化并保存/恢复底层 Vector3 实例。将一些属性/方法添加到模仿底层 Vector3 的属性/方法的包装器中,并通过简单地调用该底层实例来实现。然后,您可以将 Vector3 的每个实例替换为 Vector3W 并知道它会正确保留。

    【讨论】:

    • 感谢您的想法,尽管它并不理想。我正在寻找类似于您可以使用 json.NET 执行的操作,您可以在其中将属性放在指向该对象的自定义序列化程序的类成员之上。这种序列化方法没有类似的吗?
    • 我不知道。
    • 这是我选择的选项。我也这样做了,以便我可以将 Vector3 隐式转换为 Vector3W,反之亦然 - 我不必重构太多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多