簡體   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