Class 如何设计一个版本转换器(Json.net),将一个非常旧的版本转换成一个新的版本,而不需要太多的代码污点

Class 如何设计一个版本转换器(Json.net),将一个非常旧的版本转换成一个新的版本,而不需要太多的代码污点,class,serialization,architecture,versioning,json.net,Class,Serialization,Architecture,Versioning,Json.net,我的要求是创建一个高效的版本转换器设计。让我们假设以下类在每个版本中都有所发展 //版本1 internal class PatientV1 { public string FullName { get; set; } public string PatientNr { get; set; } public GenderV1 Gender { get; set; } } internal enum GenderV1

我的要求是创建一个高效的版本转换器设计。让我们假设以下类在每个版本中都有所发展

//版本1

    internal class PatientV1
    {
        public string FullName { get; set; }
        public string PatientNr { get; set; }
        public GenderV1 Gender { get; set; }
    }

    internal enum GenderV1
    {
        MALE,
        FEMALE
    }
//版本2

    internal class PatientV2
    {
        public Name FullName { get; set; }
        public string PatientNr { get; set; }
        public GenderV2 Gender { get; set; }
    }

    internal class Name
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Title { get; set; }
    }

    internal enum GenderV2
    {
        MALE,
        FEMALE,
        UNKNOWN
    }
//版本3

    internal class PatientV3
    {
        public IPerson Person { get; set; }
        public string PatientNr { get; set; }
    }

    internal interface IPerson
    {
        Name Name { get; set; }
        GenderV3 Gender { get; set; }
    }


    internal class Person : IPerson
    {
        public Name Name { get; set; }
        public GenderV3 Gender { get; set; }
    }


    internal enum GenderV3
    {
        MALE,
        FEMALE,
        MALE_TO_FEMALE_CONVERSION_INPROGRESS,
        FEMALE_TO_CONVERSION_INPROGRESS,
        UNKNOWN
    }
我已经创建了JsonConverter来将一个版本反序列化到另一个版本。这增加了许多转换器的组合((n-1)!),例如

  • PatientV1ToV2Converter从版本1转换为版本2
  • PatientV1tov3转换器从版本1转换为版本3
  • PatientV2Tov3转换器从版本2转换为版本3
  • 因此,我希望PatientV1-Tov3Converter调用PatientV1-Tov2Converter将患者从PatientV1带到PatientV2,然后PatientV1-Tov3Converter处理PatientV2,使其成为PatientV3

    所有这些我都希望在应用程序目录中不存在任何旧版本的Patient(PatientV1和PatientV2)


    任何设计,无论是否有旧的dll限制,我都可以接受。

    您的方法是正确的。其他一些项目也在使用类似的方法来处理升级


    例如,MythTV项目使用了相同的想法,即如何从任何旧版本升级数据库模式live。到目前为止,他们已经能够无缝地处理了。

    我在我的项目中也做了类似的事情

    我已经准备好了

    serializerSettings.Converters = new List<JsonConverter>() { new MyAppVersionConverter() };
    
    现在,通过添加或删除要转换为所需版本的属性来修改现有的
    jObjectV

    e、 从我的代码

    JProperty firstNameProp = new JProperty( "FirstName", firstName );
    JProperty lastNameProp = new JProperty( "LastName", lastName );
    JProperty typeProperty = new JProperty( "$type", "MyDetailV2.EmployeeDetail, MyDetailV2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" );
    
    JObject jObjectV2 = new JObject();
    jObjectV2.Add( typeProperty );
    jObjectV2.Add( firstNameProp );
    jObjectV2.Add( lastNameProp );
    
    return jObjectV2.ToObject<EmployeeDetail>();
    
    JProperty firstNameProp=新的JProperty(“FirstName”,FirstName);
    JProperty lastNameProp=新的JProperty(“LastName”,LastName);
    JProperty typeProperty=newjproperty($type”,“MyDetailV2.EmployeeDetail,MyDetailV2,Version=2.0.0.0,Culture=neutral,PublicKeyToken=null”);
    JObject jObjectV2=新的JObject();
    jObjectV2.Add(类型属性);
    jObjectV2.Add(firstNameProp);
    jObjectV2.Add(lastNameProp);
    返回jObjectV2.ToObject();
    
    我仍在改进东西。我将张贴一旦我做了完全的改变


    如果您在这方面有任何问题,请告诉我

    您知道如何使用Json.net在有或没有(首选)旧dll限制的情况下执行此操作吗?这看起来很好。我也这么认为,但在构建JObject和反序列化到object和….时遇到了麻烦。。。。我真的很期待看到你的完整解决方案。还有一件事。您已经提到了
    JProperty typeProperty=newjproperty($type”,“MyDetailV2.EmployeeDetail,MyDetailV2,Version=2.0.0.0,Culture=neutral,PublicKeyToken=null”),我们不必将其详细指定为完全限定类型名,对吗?
    
    JProperty firstNameProp = new JProperty( "FirstName", firstName );
    JProperty lastNameProp = new JProperty( "LastName", lastName );
    JProperty typeProperty = new JProperty( "$type", "MyDetailV2.EmployeeDetail, MyDetailV2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" );
    
    JObject jObjectV2 = new JObject();
    jObjectV2.Add( typeProperty );
    jObjectV2.Add( firstNameProp );
    jObjectV2.Add( lastNameProp );
    
    return jObjectV2.ToObject<EmployeeDetail>();