繁体   English   中英

C#程序不会反序列化xml文件

[英]C# program will not deserialize xml file

这个问题的背景是一个月项目的里程碑。 总体情况是在视频传感器软件主机与其目标外设之间创建虚拟接口,以便可以抽象出某些硬件差异。

现在,我正在建立我的类,并对包含我的团队项目将要处理的数据结构的xml文件进行反序列化。 这是处理反序列化的代码部分:

MainWindow.xaml.cs(GUI主类)

    private void DeserializeEdsSettings()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(EDSRegisters));
        FileStream fs = new FileStream(EDSFileLocation, FileMode.Open);
        Statics.edsRegisters = (EDSRegisters) serializer.Deserialize(fs);
        fs.Close();
        Statics.EDSPackets = new ObservableCollection<EDSRegister>(); //Statics parameter.
        foreach (EDSRegister register in Statics.edsRegisters.storedRegisters)
        {
            Statics.EDSPackets.Add(register.DeepClone());
        }

    }

这是与下面的XML文件中的EDSRegister标记相对应的基本类。 这种结构是我将要使用的数据的基础。

[Serializable]
public class EDSRegister : INotifyPropertyChanged
{
    private bool _IsVisible = true;
    [System.Xml.Serialization.XmlIgnore]
    public bool IsVisible
    {
        get { return _IsVisible; }
        set
        {
            _IsVisible = value;
            NotifyPropertyChanged("IsVisible");
        }
    }
    private string _RegisterAddress = "Enter Register Value";
    private string RegisterAddress
    {
        get { return _RegisterAddress; }
        set 
        {
            _RegisterAddress = value;
            NotifyPropertyChanged("RegisterAddress");
        }
    }

这是EDSRegisters的Collection的包装,以及将数据反序列化到的内容。 请注意,ObservableCollection的Count始终保持为0。

    public class EDSRegisters
    {
    [XmlArray("EDSRegisters")]
    [XmlArrayItem("EDSRegister")]
    public ObservableCollection<EDSRegister> storedRegisters = new ObservableCollection<EDSRegister>();
    public EDSRegisters()
    {
    }    
    }

这是我要反序列化的xml文件

    <?xml version="1.0"?>
<EDSRegisters>
  <EDSRegister>
    <RegisterAddress>0</RegisterAddress>
  </EDSRegister>
  <EDSRegister>
    <RegisterAddress>1</RegisterAddress>
  </EDSRegister>
  <EDSRegister>
    <RegisterAddress>2</RegisterAddress>
  </EDSRegister>
  <EDSRegister>
    <RegisterAddress>3</RegisterAddress>
  </EDSRegister>
</EDSRegisters>

请注意,我还想知道如何自己调试该问题。 我是C#的新手,在没有太多UnitTesting经验的情况下就能够顺利滑行,这可能说明了我的经验水平。

感谢您能给我的任何帮助。

您可以将您的班级更改为此:

[XmlRoot("EDSRegister")]
public class EDSRegister {
}

[XmlRoot("EDSRegisters")]
public class EDSRegisters : ObservableCollection<EDSRegister> {
  public EDSRegisters() {
  }
}

样本序列化:

var foo = @"<?xml version=""1.0""?>
<EDSRegisters>
  <EDSRegister>
    <RegisterAddress>0</RegisterAddress>
  </EDSRegister>
  <EDSRegister>
    <RegisterAddress>1</RegisterAddress>
  </EDSRegister>
  <EDSRegister>
    <RegisterAddress>2</RegisterAddress>
  </EDSRegister>
  <EDSRegister>
    <RegisterAddress>3</RegisterAddress>
  </EDSRegister>
</EDSRegisters>";

XmlSerializer serializer = new XmlSerializer(typeof(EDSRegisters));
var bar = serializer.Deserialize(new StringReader(foo));

笔记:

  • 您正在混合使用viewmodel类和序列化类。 XmlSerializer有自己的规则(只有具有公共构造函数的public成员/ public类),因此您可能需要进行去耦。
  • [Serializable]对xml序列化器无效-仅用于二进制序列化
  • 如果您想使用xml序列化程序,我建议使用相反的方法(设计xml序列化类,将它们填充为虚拟数据,对其进行序列化,然后查看xml输出是什么样子)

暂无
暂无

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

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