简体   繁体   English

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

[英]DataContractSerializer: can't deserialize because of changed property type

I have a property named Lender which previously was a string , and has since changed to the complex type Lender . 我有一个名为Lender的属性,该属性以前是一个字符串 ,此后已更改为复杂类型Lender I thought an implicit operator overload would resolve the transformation from a string to an object, but it doesn't, and deserialization fails. 我认为隐式运算符重载可以解决从字符串到对象的转换,但不能,并且反序列化失败。

Can I fix this in any way, or must I refactor my code for backwards compatibility? 我可以以任何方式解决此问题,还是必须重构代码以实现向后兼容?

Before: 之前:

class AnObject {
  string Lender { get; set; }
}

After: 后:

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);
  }
}

Exception: 例外:

Error in line 1 position 249. Expecting state 'Element'.. Encountered 'Text' with name '', namespace ''. 第1行的位置249错误。期望状态为“元素”。遇到名称为“名称空间”的“文本”。

You implemented implicit operator in wrong class, it should be in Lender . 您在错误的类中实现了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;
    }
}

Then you can do 那你可以做

var obj = new AnObject();
obj.Lender = new Lender("lender");

and via implicit conversion 并通过隐式转换

var obj = new AnObject();
obj.Lender = "lender";

Edit: Would the infamous dynamic do? 编辑:臭名昭著的动态会吗? Even if it works, it's scary. 即使有效,也很可怕。

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;
        }
    }
}

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM