using System.Collections.Generic;
using System.Xml.Serialization;
public static void Main()
List<InvoicePair> data = new List<InvoicePair>
new InvoicePair(new EInvoice{Version="1.03"},new TradeInvoice{Id=1,Value=100}),
new InvoicePair(new EInvoice{Version="1.03"},new TradeInvoice{Id=2,Value=200}),
new InvoicePair(new EInvoice{Version="1.03"},new TradeInvoice{Id=3,Value=300})
MemoryStream stream = new MemoryStream();
Root.Serialize(data, stream);
Console.WriteLine(Encoding.UTF8.GetString(stream.ToArray()));
stream.Seek(0, SeekOrigin.Begin);
var deserialized = Root.Deserialize(stream);
public InvoicePair(EInvoice eInvoice, TradeInvoice tradeInvoice)
TradeInvoice = tradeInvoice;
public EInvoice EInvoiceInfo { get; set; }
public TradeInvoice TradeInvoice { get; set; }
RootBodies = new List<Invoice>();
[XmlElement(Type = typeof(EInvoice), ElementName = "e-Invoice")]
[XmlElement(Type = typeof(TradeInvoice), ElementName = "TradeInvoice")]
public List<Invoice> RootBodies { get; set; }
public static void Serialize(IEnumerable<InvoicePair> invoices, Stream stream)
foreach (var invoice in invoices)
root.RootBodies.Add(invoice.EInvoiceInfo);
root.RootBodies.Add(invoice.TradeInvoice);
XmlSerializer serializer = new XmlSerializer(typeof(Root));
serializer.Serialize(stream, root);
public static IEnumerable<InvoicePair> Deserialize(Stream stream)
XmlSerializer serializer = new XmlSerializer(typeof(Root));
Root root = serializer.Deserialize(stream) as Root;
for (int i = 0; i < root.RootBodies.Count; i += 2)
yield return new InvoicePair((EInvoice) root.RootBodies[i], (TradeInvoice) root.RootBodies[i+1]);
[XmlInclude(typeof(EInvoice))]
[XmlInclude(typeof(TradeInvoice))]
public abstract class Invoice
public class EInvoice : Invoice
public string Version { get; set; }
[XmlRoot("TradeInvoice")]
public class TradeInvoice : Invoice
public int Id { get; set; }
public int Value { get; set; }