【问题标题】:How to serialize dynamic object to xml c#如何将动态对象序列化为xml c#
【发布时间】:2018-05-25 06:20:29
【问题描述】:

我有一个object {System.Collections.Generic.List<object>},其中包含 1000 个 object {DynamicData},每个都有 4 个键和值,还有一个 List,里面有 2 个键和值。 我需要将此对象序列化为 XML 文件,我尝试了正常序列化,但它给了我这个异常 = The type DynamicData was not expected,我该如何序列化这个对象?

代码如下:

           //output is the name of my object
            XmlSerializer xsSubmit = new XmlSerializer(output.GetType());
            var xml = "";

            using (var sww = new StringWriter())
            {
                using (XmlWriter writers = XmlWriter.Create(sww))
                {
                    try
                    {
                        xsSubmit.Serialize(writers, output);
                    }
                    catch (Exception ex)
                    {

                        throw;
                    }
                    xml = sww.ToString(); // Your XML
                }
            }

我可以逐行和逐元素地创建 xml 文件,但我想要更快且代码更少的东西。 我的对象的结构是这样的:

output (count 1000)
 [0]
   Costumer - "Costumername"
   DT - "Date"
   Key - "Key"
   Payment - "x"
   [0]
    Adress - "x"
    Number - "1"
 [1]...
 [2]...

【问题讨论】:

标签: c# xml xml-serialization xmlserializer dynamicobject


【解决方案1】:

您可以使用IXmlSerializable实现自己的序列化对象

[Serializable]
public class ObjectSerialize :  IXmlSerializable
{
    public List<object> ObjectList { get; set; }

    public XmlSchema GetSchema()
    {
        return new XmlSchema();
    }

    public void ReadXml(XmlReader reader)
    {

    }

    public void WriteXml(XmlWriter writer)
    {
        foreach (var obj in ObjectList)
        {   
            //Provide elements for object item
            writer.WriteStartElement("Object");
            var properties = obj.GetType().GetProperties();
            foreach (var propertyInfo in properties)
            {   
                //Provide elements for per property
                writer.WriteElementString(propertyInfo.Name, propertyInfo.GetValue(obj).ToString());
            }
            writer.WriteEndElement();
        }
    }
}

用法

        var output = new List<object>
        {
            new { Sample = "Sample" }
        };
        var objectSerialize = new ObjectSerialize
        {
            ObjectList = output
        };
        XmlSerializer xsSubmit = new XmlSerializer(typeof(ObjectSerialize));
        var xml = "";

        using (var sww = new StringWriter())
        {
            using (XmlWriter writers = XmlWriter.Create(sww))
            {
                try
                {
                    xsSubmit.Serialize(writers, objectSerialize);
                }
                catch (Exception ex)
                {

                    throw;
                }
                xml = sww.ToString(); // Your XML
            }
        }

输出

<?xml version="1.0" encoding="utf-16"?>
<ObjectSerialize>
    <Object>
        <Sample>Sample</Sample>
    </Object>
</ObjectSerialize>

注意:如果你想用相同的类型反序列化,请注意这一点 (ObjectSerialize) 你应该提供ReadXml。如果你想 指定架构,您也应该提供GetSchema

【讨论】:

  • 我无法在我的代码中创建对象,我会从内存中获取他。我如何使用已经创建的对象来实现您的代码?像这样:object output = (The part of the memory that it is stored);
  • 我声明了“Sample”对象作为示例。忽略它,并在 ObjectSerialize 实例中设置您的输出对象。
  • 好的,序列化后如何创建 XML 文件?
  • 只需使用 System.IO.File.WriteAllText(@"C:\objectXml.xml",xml);
  • 它有效,我将在其他对象中测试,非常感谢
猜你喜欢
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2012-11-22
  • 2014-11-30
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多