Class 如何设计一个版本转换器(Json.net),将一个非常旧的版本转换成一个新的版本,而不需要太多的代码污点
我的要求是创建一个高效的版本转换器设计。让我们假设以下类在每个版本中都有所发展 //版本1Class 如何设计一个版本转换器(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
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)!),例如
任何设计,无论是否有旧的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>();