2012-04-30 22 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