C# .NET实体序列化:是否从文件的旧版本加载更新的实体?

C# .NET实体序列化:是否从文件的旧版本加载更新的实体?,c#,serialization,refactoring,C#,Serialization,Refactoring,情况是这样的 我创建了一个实体。它有一个名字和姓氏字段 我将一些实例序列化为一个文件 现在我已经更新了实体。我没有名字和姓氏,而是有一个全名字段,并且删除了名字和姓氏属性 我想将我在步骤(2)中创建的实例反序列化到此新版本 用C语言编写翻译程序的正确方法是什么?有这样的班级吗 注意:我以前也问过类似的问题,但我没有用同样的方式表达。关于如何处理字段名更改的情况,我得到了一个非常好的答案,但对于如何处理这种新情况,我没有得到答案。您可以在此处查看旧问题好的,因此使用代理可能是答案。我仍然不能完全确

情况是这样的

  • 我创建了一个实体。它有一个名字和姓氏字段
  • 我将一些实例序列化为一个文件
  • 现在我已经更新了实体。我没有名字和姓氏,而是有一个全名字段,并且删除了名字和姓氏属性
  • 我想将我在步骤(2)中创建的实例反序列化到此新版本
  • 用C语言编写翻译程序的正确方法是什么?有这样的班级吗


    注意:我以前也问过类似的问题,但我没有用同样的方式表达。关于如何处理字段名更改的情况,我得到了一个非常好的答案,但对于如何处理这种新情况,我没有得到答案。您可以在此处查看旧问题

    好的,因此使用代理可能是答案。我仍然不能完全确定什么是代理,但如果您使用DataContract序列化,它似乎可以提供更多的控制,所以使用代理可能是答案。我仍然不能完全确定代理是什么,但如果您使用DataContract序列化,它似乎可以提供更多的控制,您可以实现ISerializable并处理反序列化代码中的向后兼容性。在下面的示例中,我还说明了一个事实,即应用程序的旧版本可能仍在使用数据存储

        public Object(SerializationInfo info, StreamingContext context) {
            try { fullName = info.GetString("fullName"); }
            catch (SerializationException) {
                // fullName not found. Old version
                string firstName = info.GetString("firstName");
                string lastName = info.GetString("lastName");
                fullName = firstName + " " + lastName;
            }
        }
    
        public void GetObjectData(SerializationInfo info, StreamingContext context) {
            info.AddValue("fullName", fullName);
            // Deal with old version of application
            string[] splitName = fullName.Split(' ');
            info.AddValue("firstName", splitName[0]);
            info.AddValue("lastName", splitName[1]);
        }
    

    在实现ISerializableSurrogate时可以使用相同的主体。

    您可以实现ISerializable并处理反序列化代码中的向后兼容性。在下面的示例中,我还说明了一个事实,即应用程序的旧版本可能仍在使用数据存储

        public Object(SerializationInfo info, StreamingContext context) {
            try { fullName = info.GetString("fullName"); }
            catch (SerializationException) {
                // fullName not found. Old version
                string firstName = info.GetString("firstName");
                string lastName = info.GetString("lastName");
                fullName = firstName + " " + lastName;
            }
        }
    
        public void GetObjectData(SerializationInfo info, StreamingContext context) {
            info.AddValue("fullName", fullName);
            // Deal with old version of application
            string[] splitName = fullName.Split(' ');
            info.AddValue("firstName", splitName[0]);
            info.AddValue("lastName", splitName[1]);
        }
    

    在实现ISerializableSurrogate时,可以使用相同的主体。

    代理是一个“替身”,您可以使用它来代替原始代理。与其尝试直接反序列化到新实体中(使用
    FullName
    字段),不如反序列化到另一个类中,该类的属性与原始实体的属性相匹配。一旦你填充了代理,你可以使用C代码将细节转换成新的格式。+1谢谢-你能在Vendel的回答下查看我的评论吗?我仍然认为代孕是一种方式(在这一点上,我可能应该试试),但如果你马上知道这是否是我做这件事的“正确”方式,它会让我走上正确的轨道。链接中描述的接口几乎与ISerializable完全相同,ISerializable使我能够避免保留一组我认为是“代理”的类。代理是一个“代理”,您可以使用它来代替原始类。与其尝试直接反序列化到新实体中(使用
    FullName
    字段),不如反序列化到另一个类中,该类的属性与原始实体的属性相匹配。一旦你填充了代理,你可以使用C代码将细节转换成新的格式。+1谢谢-你能在Vendel的回答下查看我的评论吗?我仍然认为代孕是一种方式(在这一点上,我可能应该试试),但如果你马上知道这是否是我做这件事的“正确”方式,它会让我走上正确的轨道。链接中描述的接口与ISerializable几乎相同,ISerializable使我能够避免保留一组我认为是“替代”的类。然而,我遇到了iSerializationSubrogate,它看起来非常相似。因为我使用的是DataContract,所以你能马上知道我是否应该使用它吗。我猜这可能会更好,因为它将序列化代码与实体分离(如果我处理多个版本,这可能是我想要的)@i8abug当然您可以使用iSerializationSubrogate,您是正确的,因为它具有将序列化代码与实体分离的优点。不过,可以使用与我的示例相同的原则。这是有道理的。然而,我遇到了iSerializationSubrogate,它看起来非常相似。因为我使用的是DataContract,所以你能马上知道我是否应该使用它吗。我猜这可能会更好,因为它将序列化代码与实体分离(如果我处理多个版本,这可能是我想要的)@i8abug当然您可以使用iSerializationSubrogate,您是正确的,因为它具有将序列化代码与实体分离的优点。不过,可以使用与我的示例中相同的原则。我计划使用DataContract序列化。感谢您的澄清。我计划使用DataContract序列化。谢谢你的澄清。