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 序列化程序序列化的对象。