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 が将来もデシリアライズ可能であることを確認しようとしています。

基本的に、空の (存在しない) フィールドは空白にし、削除されたフィールドは忘れる必要があります。

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);
    }

JSON や XML の代わりに bytearray を使用してこれを行う方法はありますか?

4

1 に答える 1

1

私はジェームズに同意します。古いクラスと新しいクラスの両方が同じ親から継承されている場合、それは単なるアーキテクチャ上の問題 (DRY 原則) ではありません。親クラスでシリアライザーを作成します。これは、あるクラスから欠落している値の「null」値を出力し、除外したい他のクラスのフィールドを含まないだけです。次に、派生クラスではなく親クラスでシリアライザーを呼び出すと、すべてが同じように表示されます。

ただし、子クラスでは、新しいシリアライゼーション形式に含まれていない値をどうしたいのかを理解する必要があります (つまり、コードの残りの部分は、そのフィールドが空のクラスを取得しても満足でしょうか?)。

于 2012-07-27T00:18:26.100 に答える