2012-03-16 58 views
0

所以我覺得自己就像一個noob,但是現在一直困擾着我或者幾個小時,雖然我已經閱讀了許多問題/教程,但是我似乎無法得到這份工作。毫無疑問,這是我遇到的一個基本問題,非常明顯,我完全錯過了它。無論如何,所以我有這個問題。我有一個班級,只是我想要的方式,像這樣;序列化數組的問題

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Serialization; 
using System.Text; 

namespace SMCProcessMonitor 
{ 

public class Config 
{ 
    private string recipient = ""; 
    private int serverport; 
    private string username = ""; 
    private string password = ""; 

    public Config() 
    { 
    } 

    public string Recipient 
    { 
     get 
     { 
      return recipient; 
     } 
     set 
     { 
      recipient= value; 
     } 
    } 

隨後獲取/設置不同的變量。這工作正常,但它是我努力與下一步。由於這些處理的代碼只是單一的情況下,這是比較容易的,但接下來的部分,我想補充,是程序列表,可能看起來像

<program> 
    <programname>program1</programname> 
    <programfilepath>C:/...</programfilepath> 
</program> 
<program> 
<programname>program2</programname> 
<programfilepath>D:/...</programfilepath> 
</program> 

我假設在這裏,我想例如,在序列化時使用數組來存儲不同的程序,例如,我嘗試了許多不同的方法。如果我創建了下面的類來保存我的數組的細節,就像這樣:

public class Company 
{ 
    public programs[] Programs; 
} 
public class Programs 
{ 
    public string mFileName; 
    public string mFilePath; 
} 

於是我來使用這個數組來填充數據,並使用稱它爲以下內容:

 SMCProcessMonitor.ConfigManager.mConfigurations.programs = sFile; 

的左手邊看起來不錯,但試圖將它分配給變量sFile(這是一個字符串持有文件名),我得到了幾個錯誤(取決於我嘗試,例如sFile.ToArray等,但即轉換錯誤,如如:

無法將類型'字符串'隱式轉換爲'SMCProcessMon itor.Config.Programs []'

所以用那長長的囉嗦的問題問任何人有任何指針,或提示哪裏會出錯?就像我說的那樣肯定它的東西愚蠢地基本,即時通訊失敗掌握..

前進的歡呼聲, 謝恩。

回答

2

對於動態大小的集合,使用數組有點繁瑣。最簡單的方法可能是去一個List,使它看起來像一樣;

public class Company 
{ 
    public List<Program> Programs = new List<Program>(); 
} 
public class Program 
{ 
    public string FileName; 
    public string FilePath; 
} 

添加條目會再看看像;

Programs.Add(new Program { FileName = sFile, FilePath = sPath }); 

...你可以通過訪問它...

var theFirstProgram = Programs[0]; 
+1

假設您的程序字符串是XML,您可以看看linq to xml,作爲將XML解析到程序對象的快速方法。 http://weblogs.asp.net/brijmohan/archive/2008/11/22/linq-to-xml-and-linq-to-objects-basic-sample.aspx – rie819 2012-03-16 16:33:59

0

對於數組中的每個條目,您將不得不添加一個新的程序條目,因此您需要創建一個程序並將字符串添加到該列表中(mFilename,mFilePath),然後將其添加到該數組中。

您還需要一些陣列空間。

0

XMLArray屬性?

您還可以使用XMLAttribute允許的屬性在你的XML標籤被添加,這是有點更容易閱讀,可以用來保持一個需要被編輯易於遵循XML文件。

示例...

public class Army 
{ 
    // Fields 
    private List<UnitCategory> _unitCategory; 
    private string _armyName; 

    // Properties 
    [XmlArray("unit-category")] 
    public List<UnitCategory> UnitCategory 
    { 
     get { return _unitCategory; } 
     set { _unitCategory = value; } 
    } 
} 
    [XmlAttribute("name")] 
    public string ArmyName 
    { 
     get { return _armyName; } 
     set { _armyName = value; } 
    } 
0

問題是sFile字符串和你正在試圖將其分配到一個陣列

你將需要加載由sFile首先表示的文件,是這樣的:

var fileStream = File.Open(sFile, FileMode.Open); 

接下來,您需要將文件內容反序列化到對象圖:

var xs = new XmlSerializer(typeof(Company)); 

// this will raise an error if the contents don't match the expected object type 
// else will return the Company object. 
var data = (Company)xs.Deserialize(fileStream); 

然後您就可以將解串對象分配給您的配置:

SMCProcessMonitor.ConfigManager.mConfigurations.programs = data.Programs; 

One n ote我想說的是,根據您提供的XML,您的類定義CompanyPrograms將不會正確反序列化。您將不得不使用一些XmlAttributes來提供XML元素和對象圖之間的正確對應關係。