我有以下课程:
[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在将来仍然可以反序列化,尽管被序列化的类略有不同。
基本上,空白的字段(不存在)应该被删除,而那些被删除的字段应该被遗忘。
我正在从Object到Byte [](以及后面)进行序列化。不是XML或JSON
private static byte[] ObjectToByteArray(object _Object)
{
try
{
var memoryStream = new MemoryStream();
new BinaryFormatter().Serialize(memoryStream, _Object);
return memoryStream.ToArray();
}
catch (Exception e)
{
Console.WriteLine("Exception caught in process: {0}", e);
}
return null;
}
private static object ByteArrayToObject(byte[] aBytes)
{
try
{
var memoryStream = new MemoryStream(aBytes);
var serializedObject = new BinaryFormatter().Deserialize(memoryStream);
return serializedObject;
}
catch (Exception e)
{
Console.WriteLine("Exception caught in process: {0}", e);
}
return null;
}
这是一个简化的UnitTest,可能解释了我的尝试比我能做的更好
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);
}
有什么方法可以做到这一点,仍然使用bytearray而不是JSON或XML?
答案 0 :(得分:1)
我同意詹姆斯的观点。如果旧类和新类都从同一个父类继承,那么它不仅仅是一个架构的东西(DRY原则),你可以完成工作。在父类上创建一个序列化程序,它将为一个类中的缺失值输出“null”值,甚至不包含要排除的另一个字段中的字段。然后在父类而不是派生类上调用序列化器,所有内容最终都会看起来相同。
在子类上,你仍然需要弄清楚你想用新的序列化格式中包含的值做什么(即你的代码的其余部分会很高兴得到一个带有该字段的类?)。