2013-07-20 38 views
0

我只想使用.NET框架(版本2.0)的XML-Serializer。 我創建方法,序列化和反序列化我的設置:未找到根元素。問題?

public static void Save(string filename) 
{ 
    var settings = Settings.Instance; 

    if (File.Exists(filename)) 
     File.Delete(filename); 

    using (var stream = File.OpenWrite(filename)) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Settings)); 
     serializer.Serialize(stream, settings); 
    } 
} 

另存的方法作品真的很好,結果我得到了下面的XML文檔:

<?xml version="1.0"?> 
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <EnableHooking>true</EnableHooking> 
    <IncludePressedKeys>false</IncludePressedKeys> 
    <EnableFastScroll>false</EnableFastScroll> 
    <FastScrollingHotKeys> 
    <VirtualKeys>Control</VirtualKeys> 
    <VirtualKeys>Alt</VirtualKeys> 
    </FastScrollingHotKeys> 
    <ScrollSpeed>2</ScrollSpeed> 
    <FastScrollSpeed>10</FastScrollSpeed> 
</Settings> 

如果我嘗試反序列化此文檔我得到一個異常XmlException,它告訴我根元素丟失。我試圖設置XmlRootAttribute,試圖檢查文件名和流位置。一切都好。現在我終於嘗試通過XmlDocument類讀取加載文件,該類完美地工作。現在我真的不知道會發生什麼。所以你可以看看加載方法:

public static void Load(string filename) 
{ 
    if (!File.Exists(filename)) 
     throw new ArgumentException("File not found.", "filename", new FileNotFoundException()); 

    //works 
    var doc = new XmlDocument(); 
    doc.Load(XmlReader.Create(File.OpenRead(filename))); 
    Console.WriteLine(doc.DocumentElement.FirstChild); 

    using (var stream = File.OpenRead(filename)) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Settings)); 
     _instance = serializer.Deserialize(stream) as Settings; 
    } 
} 

希望任何人都有一個想法。

+0

你的Settings類是什麼樣的? –

+0

設置類的確會非常有幫助。當我用前兩個屬性EnableHooking和IncludePressedKeys創建一個小類時,我不會遇到任何錯誤。那麼你的問題是什麼?該代碼似乎工作,但你想要一個不同的解決方案? – Richard

+0

不,我不想要一個不同的解決方案。我得到一個「根元素缺失」xmlexception與這個代碼。 @Richard –

回答

1

當我在OSX上用Xamarin Studio使用下面的代碼(我在其中添加了一個簡單版本的Settings類)時,我沒有遇到任何錯誤。

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

namespace Test 
{ 
    class MainClass 
    { 
     private static Settings _instance; 

     public static void Main (string[] args) 
     { 
      Load ("Settings.xml"); 
     } 

     public static void Load(string filename) 
     { 
      if (!File.Exists(filename)) 
       throw new ArgumentException("File not found.", "filename", new FileNotFoundException()); 

      //works 
      var doc = new XmlDocument(); 
      doc.Load(XmlReader.Create(File.OpenRead(filename))); 
      Console.WriteLine(doc.DocumentElement.FirstChild); 

      using (var stream = File.OpenRead(filename)) 
      { 
       XmlSerializer serializer = new XmlSerializer(typeof(Settings)); 
       _instance = serializer.Deserialize(stream) as Settings; 
      } 
     } 
    } 

    public class Settings 
    { 
     public bool EnableHooking { 
      get; 
      set; 
     } 
     public bool IncludePressedKeys { 
      get; 
      set; 
     } 
    } 
} 

當我檢查_instance的值時,屬性設置爲正確的值。我在第二個屬性後剝離了XML。這個問題可能出現在更復雜的XmlElement「FastScrollingHotKeys」中。你能發佈你的設置類嗎?

+0

當我在Win7和VS Express 2010上運行它時,它也可以正常工作。另外,當我將項目屬性設置爲Framework 2.0。 – Richard