【问题标题】:How ignore read only property set during XmlSerializer deserialization?如何在 XmlSerializer 反序列化期间忽略只读属性集?
【发布时间】:2017-06-04 06:23:46
【问题描述】:

我在课堂上只读过属性

[XmlIgnore]
public string Amount
{
    get { return "Some value";  }
}

当我尝试从文件中反序列化对象时,我不希望反序列化抛出异常并且我没有收到对象。我尝试使用 xml 忽略属性,但这对我没有帮助。只有我需要设置文件中存在的属性。

XML 文件

<?xml version="1.0" encoding="utf-8"?>
<Class xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Id>1</KaumeheId>
  <PrivaatKey>123</PrivaatKey>
</Class>

public class Class
{
    public int Id { get; set; }
    public string PrivaatKey { get; set; }
    public string Amount
    {
        get { return "Some value"; }
    }
}

序列化器

public static class XmlDeserializerService<T>
{
    public static void LoadDataToClass(T obj, string filePath)
    {

        XmlSerializer serializer = new XmlSerializer(typeof(T));
        using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
        {
            obj = (T) serializer.Deserialize(fileStream);
        }
    }
}

附加信息(修改):

如果我在 obj.Amount 下查看调试器,我有 Amount = 'obj.Amount' 抛出了 System.NullReferenceException 类型的异常

【问题讨论】:

  • 您是否尝试过XmlAttributeOverrides 类以查看其行为是否有所不同?
  • 你的例外是什么?您的示例适用于您的 xml(如果您在 xml 中更正了 Id 标签)
  • XmlIgnoreAttribute 应该可以工作,因为 XML 绝对会忽略 readonly 属性,并且应该只根据 XML 中定义的内容创建对象。关于异常的更多细节会很好。
  • @MaksimSimkin 如果我在 obj.Amount 下查看调试器,我有 Amount = 'obj.Amount' 引发了“System.NullReferenceException”类型的异常

标签: c# .net xml serialization xmlserializer


【解决方案1】:

我认为问题出在您的反序列化方法上,我会将其更改为返回对象:

public static class XmlDeserializerService<T>
{
    public static T LoadDataToClass(string filePath)
    {    
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
        {
            return  (T)serializer.Deserialize(fileStream);
        }
    }
}

我的班级是:

public class Class
{
    public int Id { get; set; }
    public string PrivaatKey { get; set; }  
    public string Amount
    {
        get { return "Some value"; }
    }
}

如果我在那之后使用它:

var r = XmlDeserializerService<Class>.LoadDataToClass(@"yourxml");

我看到所有字段:

如果你有一个有效的 xml,那么你提供的那个有无效的 Id 标签。有效的是:

<?xml version="1.0" encoding="utf-8"?>
<Class xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Id>1</Id>
  <PrivaatKey>123</PrivaatKey>
</Class>

【讨论】:

  • 你描述了一半的问题。另一半 = 提供的 XML 不正确。 OP应该用这个&lt;Id&gt;1&lt;/Id&gt;替换这个&lt;Id&gt;1&lt;/KaumeheId&gt;
  • @tym32167 是的,当然,我已经在 cmets 中写过了,但你说得对,我会更新 asnwer
  • 啊,是的。抱歉,没看到。
  • @MaksimSimkin 你能发布你的课程吗?
  • @StanislavMachel 和你一样,我已经更新了答案
猜你喜欢
  • 1970-01-01
  • 2013-08-17
  • 2012-12-09
  • 1970-01-01
  • 2017-03-07
  • 2016-05-26
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多