c# - 更改类的反序列化

标签 c# c#-4.0 deserialization

我正在开发一个程序,我通过序列化 Project 类来保存它的项目文件。 因为我还在研究它,一些属于 Project 类的类会不时发生变化(例如类有新属性)。它使“简单的”反序列化变得不可能。

有什么办法可以解决吗?我的意思是,没有编写自定义序列化程序? (这可能比我现在的水平还高)

以防万一,我使用的是 BinaryFormatter。

最佳答案

希望我正确理解了您的问题。您将一个类序列化为一个文件,此后您在程序中进行了更改(例如,您添加了另一个属性)。现在你想从文件中反序列化这个类。只要您只添加 新属性,这就不是问题。它们将被反序列化器忽略。它创建您的类的一个新实例(这就是可序列化类必须具有默认构造函数的原因)并尝试填充它在流中找到的属性以进行反序列化。如果您更改属性的类型或删除属性,您将无法反序列化原始文件。

删除属性的一种解决方法是将它们保留在类中,但停止在程序的其余部分使用它们。已更改为不同类型的属性的解决方法可能如下所示:

[Serializable]
public class MyClass
{
     int? newProperty;
     [XmlElement("Property")]
     public string OldProperty 
     {
         get { return string.Empty; }
         set 
         { 
             if (!newProperty.HasValue)
             {
                  int temp;
                  if (int.TryParse(value, out temp))
                  {
                       newProperty.Value = temp;
                  }
             }
         }
     }

     public int NewProperty
     {
         get { return newPropery.HasValue ? newProperty.Value : 0; }
         set { newProperty.Value = value; }
     }
} 

关于c# - 更改类的反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8076669/

相关文章:

c# - Entity Framework 异常 : Invalid object name

c# - 在 Visual Studio v.09 中使用 C#/.NET 的 Qt?

c# - System.Drawing 对象非托管资源处理

architecture - 服务层的服务可以互相通信吗?

c# - 在 C# 中使用索引数组反序列化 JSON

java - 使用 Jackson(Joda-Time 模块)进行 DateTime 反序列化的默认时区

c# - C#自定义用户控件...右键菜单复制文本(Java开发者学习C#)

c# - global.asax 中的 Application_Start() 事件

C# 泛型,将泛型列表转换到已知的父类?

c++ - C++中二维float数组的序列化与反序列化