我如何XML序列化对象列表数组?

时间:2012-04-30 23:47:40

标签: c# xml exception xml-serialization

当我尝试XML序列化一系列列表时,我遇到了这些错误。

  

无法生成临时类(result = 1)。错误CS1026 :)   预期错误CS1002 :;预期...错误CS1525:表达式无效   术语')'错误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();
    }
}

这是传递给它的var:

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

感谢您的帮助。

[UPDATE]

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

    public TransactionCollection()
    {
    }

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

2 个答案:

答案 0 :(得分: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:您不需要将数组“包装”到包含类型中以便序列化它们。

答案 1 :(得分: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; }

如果您确实需要使用原始示例中的Array和List,则需要使List XML可序列化: