2012-04-30 20 views
4

當我嘗試XML序列化一個列表數組時,出現這些錯誤。如何XML序列化對象列表的數組?

無法生成臨時類(結果= 1)。錯誤CS1026:) 預計錯誤CS1002:;預計...錯誤CS1525:無效的表達式 term')'錯誤CS1002:預計

這裏是我的代碼:

這是觸發異常的方法。

public static string SerializeToString<T>(T obj) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    using (StringWriter writer = new StringWriter()) 
    { 
     serializer.Serialize(writer, obj); 
     return writer.ToString(); 
    } 
} 

這是傳遞給它的變種:

List<Transaction>[] allTransactions = new List<Transaction>[20]; 

感謝您的幫助。

[更新]

public class TransactionCollection 
{ 
    public List<Transaction>[] transactions; 

    public TransactionCollection() 
    { 
    } 

    public void Set(List<Transaction>[] t) 
    { 
     transactions = t; 
    } 
} 
+0

爲什麼匿名投票? – Lee

+0

首先,xml序列化程序將尋找一個根元素,而不是傳遞數組,傳遞一個封裝你的集合的對象。 – payo

+0

好吧,我創建了一個封裝如上所示的事務列表數組的類,但是我得到了同樣的錯誤。 – Lee

回答

0

這個工作對我來說:

[XmlRoot("TransactionCollection")] 
public class TransactionCollection 
{ 
    private List<List<Transaction>> _lst = new List<List<Transaction>>(); 

    [XmlArrayItem()] 
    public List<List<Transaction>> Transactions { get { return _lst; } } 

    public TransactionCollection() 
    { 
    } 
} 

[XmlRoot("Transaction")] 
public class Transaction 
{ 
    [XmlElement("Id")] 
    public string Id = String.Empty; 
} 

測試:

void Main() 
{ 
    var transactions1 = new List<Transaction> { new Transaction(), new Transaction() }; 
    var transactions2 = new List<Transaction> { new Transaction(), new Transaction() }; 
    var trans = new TransactionCollection(); 
    trans.Transactions.Add(transactions1); 
    trans.Transactions.Add(transactions2); 
    SerializeToString(trans); 
} 

請注意,這是因爲XmlSerializer能夠制定出清單應被序列化爲數組項目。您也可以使用交易的雙陣列,而不是雙榜:

[XmlArrayItem()] 
public Transaction[][] Transactions { get; set; } 

如果你確實需要使用數組和列表作爲最初的例子,你需要讓你列表XML serialisable:

1

我不確切;這個錯誤有點令人沮喪。

但是,如果你寧願得到的東西做的,而不是診斷問題,那麼就列表轉換爲數組:

public void Run() 
    { 
     var allTransactions = new List<Transaction>[20]; 
     for (int i=0; i < allTransactions.Length; i++) 
     { 
      allTransactions[i] = new List<Transaction>(); 
     } 
     var a = Array.ConvertAll(allTransactions, x => x.ToArray()); 
     var s = SerializeToString(a); 
     System.Console.WriteLine("{0}", s); 
    } 

結果:

<ArrayOfArrayOfTransaction> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
    <ArrayOfTransaction /> 
</ArrayOfArrayOfTransaction> 

PS:你並不需要將數組「包裝」爲包含類型以序列化它們。

+0

這也適用於我。如果OP實際上傳遞空數據,我可能會看到它導致錯誤。 – bdwakefield