微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 序列化类似的类

我有以下课程:

[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?

解决方法

我同意詹姆斯的观点.如果旧类和新类都从同一个父类继承,那么它不仅仅是一个架构的东西(DRY原则),你可以完成工作.在父类上创建一个序列化程序,它将为一个类中的缺失值输出“null”值,甚至不包含要排除的另一个字段中的字段.然后在父类而不是派生类上调用序列化器,所有内容最终都会看起来相同.

在子类上,你仍然需要弄清楚你想用新的序列化格式中包含的值做什么(即你的代码的其余部分是否会很高兴得到一个带有该字段的类?).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐