DataContractSerializer:无法反序列化,因为已更改 属性 类型
DataContractSerializer: can't deserialize because of changed property type
我有一个名为 Lender 的 属性,它以前是一个 string,后来变成了复杂类型 贷方。我认为隐式运算符重载会解决从字符串到对象的转换,但事实并非如此,反序列化失败。
我可以通过任何方式解决这个问题,还是必须重构我的代码以实现向后兼容性?
之前:
class AnObject {
string Lender { get; set; }
}
之后:
class AnObject {
Lender Lender { get; set; }
}
class Lender {
public string Name { get; set; } // Previously the string property on AnObject.
public static implicit operator Lender(string name) {
return new Lender(name);
}
}
异常:
第 1 行位置 249 错误。预期状态 'Element'..遇到 'Text' 名称为“”,命名空间为“”。
您在 class 中实施了 implicit operator
,它应该在 Lender
.
中
public class AnObject
{
public Lender Lender { get; set; }
}
public class Lender
{
public Lender(string name)
{
Name = name;
}
public string Name { get; set; }
public static implicit operator Lender(string name)
{
return new Lender(name);
}
public static implicit operator string (Lender lender)
{
return lender.Name;
}
}
那你可以做
var obj = new AnObject();
obj.Lender = new Lender("lender");
并通过隐式转换
var obj = new AnObject();
obj.Lender = "lender";
编辑:臭名昭著的动态会起作用吗?就算有用,也很吓人。
public class Lender
{
public Lender(string name)
{
Name = name;
}
public string Name { get; set; }
}
public class AnObject
{
private Lender _lender;
public dynamic Lender
{
get { return _lender; }
set
{
_lender = value is string ? new Lender(value as string) : value as Lender;
}
}
}
我不得不 "transition" 将 XML 转换为新格式,方法是将 Lender 节点下的文本节点替换为 Lender 使用 DataContract 序列化程序序列化的对象。
我有一个名为 Lender 的 属性,它以前是一个 string,后来变成了复杂类型 贷方。我认为隐式运算符重载会解决从字符串到对象的转换,但事实并非如此,反序列化失败。
我可以通过任何方式解决这个问题,还是必须重构我的代码以实现向后兼容性?
之前:
class AnObject {
string Lender { get; set; }
}
之后:
class AnObject {
Lender Lender { get; set; }
}
class Lender {
public string Name { get; set; } // Previously the string property on AnObject.
public static implicit operator Lender(string name) {
return new Lender(name);
}
}
异常:
第 1 行位置 249 错误。预期状态 'Element'..遇到 'Text' 名称为“”,命名空间为“”。
您在 class 中实施了 implicit operator
,它应该在 Lender
.
public class AnObject
{
public Lender Lender { get; set; }
}
public class Lender
{
public Lender(string name)
{
Name = name;
}
public string Name { get; set; }
public static implicit operator Lender(string name)
{
return new Lender(name);
}
public static implicit operator string (Lender lender)
{
return lender.Name;
}
}
那你可以做
var obj = new AnObject();
obj.Lender = new Lender("lender");
并通过隐式转换
var obj = new AnObject();
obj.Lender = "lender";
编辑:臭名昭著的动态会起作用吗?就算有用,也很吓人。
public class Lender
{
public Lender(string name)
{
Name = name;
}
public string Name { get; set; }
}
public class AnObject
{
private Lender _lender;
public dynamic Lender
{
get { return _lender; }
set
{
_lender = value is string ? new Lender(value as string) : value as Lender;
}
}
}
我不得不 "transition" 将 XML 转换为新格式,方法是将 Lender 节点下的文本节点替换为 Lender 使用 DataContract 序列化程序序列化的对象。