您的位置:

从多个方面详解对象转XML

一、对象转XML字符串

using System.Xml.Serialization;
using System.IO;

public static string ObjectToXml(T obj)
{
    var serializer = new XmlSerializer(typeof(T));
    using (var stream = new StringWriter())
    {
        serializer.Serialize(stream, obj);
        return stream.ToString();
    }
}

  

以上代码中,我们使用了XmlSerializer将对象序列化为XML字符串。首先,我们需要通过new XmlSerializer(typeof(T))获取一个XmlSerializer实例。这个类需要传入一个类型参数,即需要被序列化的对象的类型。然后,我们将对象序列化成stream对象,并使用ToString()方法将stream对象转换为字符串并返回。

二、对象转JSON字符串

using System.Web.Script.Serialization;

public static string ObjectToJson(T obj)
{
    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(obj);
}

  

以上代码使用了JavaScriptSerializer将对象序列化为JSON字符串。与XmlSerializer类似,我们需要使用new JavaScriptSerializer()获取一个JavaScriptSerializer实例,然后使用Serialize()方法将对象序列化成字符串并返回。

三、对象转XML的设计模式

对象转XML的设计模式主要有两种:基于属性的序列化和基于元素的序列化。

基于属性的序列化指的是,将对象的属性作为XML的属性,对象的属性值作为XML属性的值进行序列化,如下所示:

public class Person
{
    [XmlAttribute]
    public string Name { get; set; }
    [XmlAttribute]
    public int Age { get; set; }
}


基于元素的序列化指的是,将对象的属性作为XML元素,对象的属性值作为XML元素的子元素进行序列化,如下所示:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}


    
   Tom
   
    
   18
   

  

在XmlSerializer中默认使用基于元素的序列化方式。

四、对象转XML时空值不转C#

在C#中,当一个属性的值为空时(如string类型的值为null或""),XmlSerializer会将这个属性的值序列化成空元素(如 <Name />),而非空元素,并在反序列化时将这个属性的值还原为null或""。如果我们希望在序列化时跳过空值属性,可以使用以下代码:

public static string ObjectToXml(T obj)
{
    var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
    var serializer = new XmlSerializer(typeof(T));
    var settings = new XmlWriterSettings
    {
        Indent = true,
        OmitXmlDeclaration = true
    };
    using (var stream = new StringWriter())
    using (var xmlWriter = XmlWriter.Create(stream, settings))
    {
        serializer.Serialize(xmlWriter, obj, emptyNamespaces);
        return stream.ToString();
    }
}

  

五、对象转XML访问有转义符号怎么办

如果要将对象中的HTML中特殊字符(如"&")转换成XML实体字符(如"&amp;"),可以使用System.Security.SecurityElement.Escape()方法来实现:

public static string ObjectToXml(T obj)
{
    var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
    var serializer = new XmlSerializer(typeof(T));
    var settings = new XmlWriterSettings
    {
        Indent = true,
        OmitXmlDeclaration = true
    };
    using (var stream = new StringWriter())
    using (var xmlWriter = XmlWriter.Create(stream, settings))
    {
        var document = new XmlDocument();
        var navigator = document.CreateNavigator();
        using (var writer = navigator.AppendChild())
        {
            serializer.Serialize(writer, obj, emptyNamespaces);
            var escapedXml = System.Security.SecurityElement.Escape(writer.OuterXml);
            xmlWriter.WriteRaw(escapedXml);
            xmlWriter.Flush();
            return stream.ToString();
        }
    }
}

  

六、对象转XML使用注解方式空值怎么转

在C#中,我们可以使用[XmlElement(IsNullable=true)]注解来处理属性为空值时的序列化。如果这个属性的值为空,XmlSerializer会将这个属性的序列化成空元素,并在反序列化时还原为null。如果这个属性的值不为空,XmlSerializer会将这个属性的值序列化成非空元素。

七、对象转换成数组

public static T[] ListToArray(IList
    list)
{
    var array = new T[list.Count];
    list.CopyTo(array, 0);
    return array;
}

   
  

以上代码将IList类型的集合转换成数组类型。

八、对象转换为JSON字符串

using Newtonsoft.Json;

public static string ObjectToJson(T obj)
{
    return JsonConvert.SerializeObject(obj);
}

  

以上代码使用了Newtonsoft.Json将对象序列化为JSON字符串。我们需要使用JsonConvert.SerializeObject()方法将对象序列化成字符串并返回。

九、对象转成XML格式打印到控制台

using System.Xml.Serialization;
using System.IO;

public static void PrintObjectToXml(T obj)
{
    var serializer = new XmlSerializer(typeof(T));
    using (var stream = new StringWriter())
    {
        serializer.Serialize(stream, obj);
        Console.WriteLine(stream.ToString());
    }
}

  

以上代码将对象序列化成XML字符串,并将XML打印到控制台。