可以提取基类中断二进制序列

时间:2018-10-25 21:16:50

标签: c# .net binary-serialization

如果我有一个包含许多字段的类,并且使用二进制序列化对其进行了序列化。

然后我提取一个基类,并将某些字段从该类移到基类中。例如

class Class
{
     int field1;
     string field2;
}

已更改为

class Class : BaseClass
{
     int field1;
}

class BaseClass
{
     string field2;
}

这是否有可能以任何方式破坏序列化-即始终可以将旧版本的Class反序列化为Class的新版本,反之亦然。

我进行的实验表明这很好,但是如果有人知道在任何情况下都不可行,那么在将其投入生产代码之前,那显然是很棒的。

1 个答案:

答案 0 :(得分:1)

编辑: 反序列化时出现问题:成员“ field1”将无法正确反序列化。

1)序列化人员:

var person = new Employee()
            { 
                Name = "Mark Zuckerberg",
                Salary = 1000
            };

var bf = new BinaryFormatter();
bf.Serialize(new FileStream("C:\\TEMP\\test.dat", FileMode.Create), person);


[Serializable]
public class Employee
{
  public string Name { get; set; }
  public decimal Salary { get; set; }
}

2)更改了类结构

[Serializable]
public abstract class Person
{
  public string Name { get; set; }           
}

[Serializable]
public class Employee : Person
{            
  public decimal Salary { get; set; }
}

3)反序列化:名称为null enter image description here


原始答案:

假设您使用的是BinaryFormatterthis文章,但没有提及任何内容,因此我猜测就可以了(编辑:不好了)。

以下是一些通常可以遵循的最佳做法(也摘自上述文章):

  • 切勿删除序列化字段。
  • 在以下情况下,切勿将NonSerializedAttribute属性应用于字段: 属性未应用于先前版本中的字段。
  • 请勿更改序列化字段的名称或类型。
  • 添加新的序列化字段时,应用OptionalFieldAttribute 属性。
  • 从字段中删除NonSerializedAttribute属性时( 在以前的版本中无法序列化),请应用 OptionalFieldAttribute属性。
  • 对于所有可选字段,请使用 序列化回调,除非默认为0或null为可接受。

为确保类型与将来的序列化引擎兼容,请遵循以下准则:

  • 始终在OptionalFieldAttribute上设置VersionAdded属性 属性正确设置。
  • 避免分支版本控制。