【问题标题】:How can I convert a List<ExpandoObject> to an XML string如何将 List<ExpandoObject> 转换为 XML 字符串
【发布时间】:2015-05-11 11:11:57
【问题描述】:

我想使用 ExpandoObjects 列表作为 Telerik 报告的数据源,但 Telerik 报告目前似乎不支持此功能。它们确实支持将 XML 作为数据源,因此我正在尝试将我的 ExpandoObjects 列表转换为 XML 字符串。

我已经看到(Can I serialize an ExpandoObject in .NET 4?)可以通过 jsonFx 将单个 ExpandoObject 序列化为 XML 字符串(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 字符串?

【问题讨论】:

    标签: c# xml telerik expandoobject dynamicobject


    【解决方案1】:

    你可以先将ExpandoObject转成IDictionary&lt;string, object&gt;,再使用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())
        }
    }
    

    【讨论】:

    • 谢谢。这似乎确实有效,尽管从 ExpandoObject 生成的 XML 似乎并不是特别有用(通常我认为,无论是来自您的代码还是其他任何人的代码),因为它序列化了用于保存属性(字段名称)的底层字典) 和价值观。出于我的目的(使用此动态数据作为 Telerik 报告的数据源),我发现最好将 ExpandoObjects 列表转换为 DataTable(或者可能绕过 expando 对象并直接转到 DataTable)并将其用作数据源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2013-11-25
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多