【问题标题】:C# XML Reader returning none when trying to access XML fileC# XML Reader 在尝试访问 XML 文件时返回无
【发布时间】:2019-05-13 14:25:07
【问题描述】:

我正在反序列化以下由序列化生成的 xml。

<BattInfo>
  <Battery>
    <BattName>TestBattery</BattName>
    <NumCellSeries>12</NumCellSeries>
    <NumCellParallel>10</NumCellParallel>
    <CelltoPackResistanceSum>3</CelltoPackResistanceSum>
    <BattThermalResistance>15</BattThermalResistance>
    <BattHeatCapacity>12</BattHeatCapacity>
  </Battery>
</BattInfo> 

我使用的代码是:

public class BattModel
{
    public string BattName { get; set; }
    public double NumCellSeries { get; set; }
    public double NumCellParallel { get; set; }
    public double CelltoPackResistanceSum { get; set; }
    public double BattThermalResistance { get; set; }
    public double BattHeatCapacity { get; set; }

}

public class BattInfo
{
    [XmlElement("Battery")]
    public List<BattModel> Battery { get; set; }

    public BattInfo()
    {
        this.Battery = new List<BattModel>();
    }
    public BattInfo(params BattModel[] data) : this()
    {
        this.Battery.AddRange(data);
    }
    public void Save(string filename)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        XmlWriter writer = XmlWriter.Create(filename, settings);
        XmlSerializer serializer = new XmlSerializer(typeof(BattInfo));
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        serializer.Serialize(writer, this,ns);
        writer.Flush();
        writer.Close();
    }
    public BattInfo Load(string filename)
    {
        XmlReader reader = XmlReader.Create(filename);
        XmlSerializer serializer = new XmlSerializer(typeof(BattInfo));
        return (BattInfo)serializer.Deserialize(reader);
    }


}

xml 被正确序列化。但是当我尝试从使用序列化生成的 xml 中读取它时,它在通过 xmlreader 读取文件时返回 none。

【问题讨论】:

  • 代码与这个调用一起工作: BattInfo loadedData = batteryInfo.Load(FILENAME);您正在返回序列化数据,可能您想要 this = (BattInfo)serializer.Deserialize(reader);
  • @jdweng 问题是,当我使用断点时,我发现这个 Load 函数中没有填充阅读器。 reader 的值为 {None}。
  • @jdweng - this = (BattInfo)serializer.Deserialize(reader); 不正确...如果你尝试你应该得到:Cannot assign to '' because it is read-only跨度>
  • 这也是我得到的。如果必须复制阅读器。阅读器从一开始就没有显示任何内容。 Deserialize() 方法返回数据。
  • 对,你不能用这个。

标签: c# xml serialization xmlreader


【解决方案1】:

我已将Load 方法设为静态并尝试了此方法……它在这里工作正常。代码如下:

void Main()
{
    new BattInfo(new BattModel(){ BattName= "test"}).Save(@"tmp.xml");  
    Console.Out.Write(BattInfo.Load(@"tmp.xml").Battery[0].BattName);
}

// Define other methods and classes here
public class BattModel
{
    public string BattName { get; set; } 
    public double NumCellSeries { get; set; }
    public double NumCellParallel { get; set; }
    public double CelltoPackResistanceSum { get; set; }
    public double BattThermalResistance { get; set; }
    public double BattHeatCapacity { get; set; }

}

public class BattInfo
{
    [XmlElement("Battery")]
    public List<BattModel> Battery { get; set; }

    public BattInfo()
    {
        this.Battery = new List<BattModel>();
    }
    public BattInfo(params BattModel[] data) : this()
    {
        this.Battery.AddRange(data);
    }
    public void Save(string filename)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        XmlWriter writer = XmlWriter.Create(filename, settings);
        XmlSerializer serializer = new XmlSerializer(typeof(BattInfo));
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        serializer.Serialize(writer, this,ns);
        writer.Flush();
        writer.Close();
    }
    public static BattInfo Load(string filename)
    {
        XmlReader reader = XmlReader.Create(filename);
        XmlSerializer serializer = new XmlSerializer(typeof(BattInfo));
        return (BattInfo)serializer.Deserialize(reader);
    }
} 

您是否希望 Load 方法填充您从中调用它的现有实例?简而言之,XmlSerializer 具有严格的建设性,因此您无法设计。

【讨论】:

  • 是的,我想填充实例。
  • 为什么要填充现有实例?当然BattInfo.Load(s)new BattInfo().Load(s) 更有意义...
  • 好的。我用过这个,BattInfo battInfo = BattInfo.Load(filepath);但是问题不存在,问题是当我阅读文件时我什么也没有。
  • 是的,当我将其设为静态时它正在工作。你能解释一下它为什么起作用吗?我是编码新手。我不好意思问这样的问题。但我不清楚它为什么起作用。
  • erm...不确定...使用您的原始代码new BattInfo().Load(s) 也可以...它只是返回一个新实例而不填充现有实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多