DataContractSerializer:不能反序列化,因为属性类型改变了

本文关键字:属性 类型 改变 因为 不能 反序列化 DataContractSerializer | 更新日期: 2023-09-27 18:06:42

我有一个名为Lender的属性,它以前是一个字符串,并且已经更改为复杂类型Lender。我认为隐式操作符重载会解决从字符串到对象的转换,但它没有,反序列化失败。

我能以任何方式修复这个问题吗?或者我必须重构我的代码以向后兼容吗?

:

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"..遇到名称为",namespace "的" Text " .

DataContractSerializer:不能反序列化,因为属性类型改变了

您在错误的类中实现了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;
        }
    }
}

我必须将XML"转换"为新的格式,方法是将Lender节点下的文本节点替换为使用DataContract序列化器序列化的Lender对象。