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

时间:2014-07-28 08:44:55

标签: c# xml debugging deserialization

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

现在,我正在构建我的类并反序列化包含我的团队项目将要处理的数据结构的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经验的情况下设法滑行,这可能说明了我的经验水平。

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

1 个答案:

答案 0 :(得分:1)

您可以将课程更改为:

[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有自己的规则(只有带有公共构造函数的公共成员/公共类),所以你可能想要进行解耦。
  • [Serializable]对xml序列化程序没有影响 - 仅用于二进制序列化
  • 如果您想使用xml序列化程序,我建议采用相反的方法(为xml序列化设计类,用虚拟数据填充它们,序列化它们并查看xml输出的外观)