2012-07-25 37 views
4

我有以下类别:序列化相似的类

[Serializable] 
    public class ExtendedAddressData 
    { 
     public String AddressLine1 { get; set; } 
     public String AddressLine2 { get; set; } 
     public String Country { get; set; } 
     public String City { get; set; } 
     public String Firstname { get; set; } 
     public String Surname { get; set; } 
     public String FakeField { get; set; } 
    } 

    [Serializable] 
    public class AddressData 
    { 
     public String AddressLine1 { get; set; } 
     public String AddressLine2 { get; set; } 
     public String Country { get; set; } 
     public String City { get; set; } 
     public String ZipCode { get; set; } 
     public String Firstname { get; set; } 
     public String Surname { get; set; } 
    } 

我试着确保旧AddressData仍是未来deserializable尽管有一个稍微不同的班级正在连载。

基本上空的字段(不存在)应该被删除,被删除的字段应该被忘记。

我从对象序列化到字节[](和后面)。不是XML或JSON

​​

这里是一个简化的单元测试,可能解释了什么是我尝试比我更可以

public void LegacySerializationSupportTest() 
    { 
     var realData = new AddressData() 
     { 
      AddressLine1 = "AddressLine1", 
      AddressLine2 = "AddressLine2", 
      City = "City", 
      Country = "Country", 
      Firstname = "Firstname", 
      Surname = "Surname", 
      ZipCode = "ZipCode" 
     }; 
     var bytearray = AddressRepository_Accessor.ObjectToByteArray(realData); 

     AddressData realObject = (AddressData) AddressRepository_Accessor.ByteArrayToObject(bytearray); 
     ExtendedAddressData fakeObject = (ExtendedAddressData) AddressRepository_Accessor.ByteArrayToObject(bytearray); 
     Assert.AreEqual(realObject.AddressLine1,fakeObject.AddressLine1); 
    } 

有什么办法,我可以做到这一点,仍然使用字节组而不是JSON或XML?

+3

你应该介绍一个基本的地址类,并将常用属性转储到其中并保留你的模型[DRY](http://en.wikipedia.org/wiki/Don't_repeat_yourself) – James 2012-07-25 13:35:31

+0

@James:我要去来建议同样的事情,但是如果底层的序列化对象实际上不是那种类型的话,你仍然会遇到转换为子类型的问题以获得额外的属性。 – mellamokb 2012-07-25 13:36:36

+0

@mellamokb是的我不认为这是OP的问题的解决方案,更多只是一般性的建议。 – James 2012-07-25 13:38:32

回答

1

我同意詹姆斯。如果老班级和新班级都是从同一个家长继承,那么你可以完成工作,这不仅仅是一个建筑事物(DRY原则)。在父类上建立一个序列化器,它将从一个类输出缺失值的“空”值,甚至不包含要排除的另一个字段的字段。然后在父类而不是派生类上调用序列化程序,并且所有内容都会以相同的方式出现。

在子类上,你仍然必须弄清楚你想用新的序列化格式中没有包含的值来做什么(也就是说,你的代码的其余部分会很快得到一个包含该字段的类空?)。