DataContractSerializer:由于更改的属性类型,无法反序列化

时间:2015-08-05 15:22:21

标签: c# datacontractserializer

我有一个名为贷方的属性,之前是字符串,后来又更改为复杂类型 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.期待状态'元素' ...遇到'文字'名称'',命名空间'。

2 个答案:

答案 0 :(得分:2)

您在错误的班级中实施了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;
        }
    }
}

答案 1 :(得分:0)

我必须通过使用DataContract序列化程序序列化的 Lender 对象替换 Lender 节点下的文本节点,将XML“转换”为新格式。