2012-07-25 48 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原則)。在父類上建立一個序列化器,它將從一個類輸出缺失值的「空」值,甚至不包含要排除的另一個字段的字段。然後在父類而不是派生類上調用序列化程序,並且所有內容都會以相同的方式出現。

在子類上,你仍然必須弄清楚你想用新的序列化格式中沒有包含的值來做什麼(也就是說,你的代碼的其餘部分會很快得到一個包含該字段的類空?)。