2015-05-11 4 views
1

Я хочу использовать список ExpandoObjects в качестве источника данных для отчета Telerik, но похоже, что в настоящее время службы Telerik не поддерживают это. Они поддерживают XML как источник данных, поэтому я пытаюсь преобразовать свой список ExpandoObjects в строку XML.Как преобразовать список <ExpandoObject> в строку XML

Я видел (в Can I serialize an ExpandoObject in .NET 4?), что человек ExpandoObject можно сериализовать в строку XML с помощью jsonFx с помощью этого (VB.net кода, а не C#):

dim XMLwriter As New JsonFx.Xml.XmlWriter 
dim serializedExpando as string = XMLwriter.Write(obj) 

или его эквивалент в C# код:

JsonFx.Xml.XmlWriter XMLwriter = new JsonFx.Xml.XmlWriter(); 
String serializedExpando = XMLwriter.Write(obj); 

Как я могу сериализовать весь список в строку XML?

ответ

3

Вы можете сериализовать его путем преобразования ExpandoObject к IDictionary<string, object> первой, а затем с помощью DataContractSerializer для сериализации:

void Main() 
{ 
    dynamic firstExpando = new ExpandoObject(); 
    firstExpando.Name = "Name"; 
    firstExpando.Age = 1; 

    dynamic secondExpando = new ExpandoObject(); 
    secondExpando.Name = "SecondName"; 
    secondExpando.Age = 2; 

    var expandoList = new List<ExpandoObject> {firstExpando, secondExpando}; 

    var list = expandoList.Select(expando => (IDictionary<string, object>)expando) 
          .ToList(); 

    var dataContractSerializer = new DataContractSerializer(list.GetType()); 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     dataContractSerializer.WriteObject(memoryStream, list); 
     string outputXml = Encoding.UTF8.GetString(memoryStream.ToArray()) 
    } 
} 
+0

Спасибо. Это действительно работает, хотя XML, созданный из ExpandoObject, кажется, не особенно полезен (в общем, я думаю, будь то из вашего кода или кого-либо еще), потому что он сериализует базовый Словарь, используемый для хранения свойств (имена полей) и значения. Для моей цели (использования этих динамических данных в качестве источника данных для отчета Telerik) я обнаружил, что лучше преобразовать список объектов ExpandoObjects в DataTable (или, возможно, обходить объекты expando и перейти прямо к DataTable) и использовать это как источника данных. – patrickL