XML序列化,编码

001*_*001 15 c# xml asp.net web-services xml-serialization

using System;

public class clsPerson
{
  public  string FirstName;
  public  string MI;
  public  string LastName;
}

class class1
{ 
   static void Main(string[] args)
   {
      clsPerson p=new clsPerson();
      p.FirstName = "Jeff";
      p.MI = "A";
      p.LastName = "Price";
      System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType());
      x.Serialize(Console.Out, p);
      Console.WriteLine();
      Console.ReadLine();
   }
} 
Run Code Online (Sandbox Code Playgroud)

取自http://support.microsoft.com/kb/815813

1)

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType());
Run Code Online (Sandbox Code Playgroud)

这条线做什么?什么是GetType()?

2)如何获得编码

<?xml version="1.0" encoding="utf-8"?>
< clsPerson xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Run Code Online (Sandbox Code Playgroud)

代替

<?xml version="1.0" encoding="IBM437"?>
 <clsPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3
 .org/2001/XMLSchema">
Run Code Online (Sandbox Code Playgroud)

或者根本不包括编码类型?

Rob*_*son 54

如果您将序列化程序传递给XmlWriter,则可以控制一些参数,如编码,是否省略声明(例如,片段)等.

这并不是一个明确的指南,而是一个替代方案,以便您可以看到正在发生的事情,以及不仅仅是首先要控制的事情.

另请注意,如果使用StringBuilder而不是MemoryStream创建XmlWriter,则xml将忽略您的编码并以utf-16编码形式出现.有关更多信息,请参阅使用utf8编码编写xml的博客文章.

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings 
{ 
    Indent = true, 
    OmitXmlDeclaration = false, 
    Encoding = Encoding.UTF8 
};

using (MemoryStream memoryStream = new MemoryStream() )
using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
{   
    var x = new System.Xml.Serialization.XmlSerializer(p.GetType());
    x.Serialize(xmlWriter, p);

    // we just output back to the console for this demo.
    memoryStream.Position = 0; // rewind the stream before reading back.
    using( StreamReader sr = new StreamReader(memoryStream))
    {
        Console.WriteLine(sr.ReadToEnd());
    } // note memory stream disposed by StreamReaders Dispose()
}
Run Code Online (Sandbox Code Playgroud)

  • 在此示例中,StreamReader将关闭MemoryStream.然后,使用XmlWriter的Dispose将尝试访问已关闭的流.有关构建使用的其他方法,请参见http://stackoverflow.com/a/8833066/28594. (6认同)

Wil*_*ean 13

1)GetType()函数返回一个Type对象,表示对象的类型,在本例中为类clsPerson.您也可以使用typeof(clsPerson)并获得相同的结果.该行为您的特定类创建一个XmlSerializer对象.

2)如果你想改变编码,我相信有一个Serialize()函数的覆盖,你可以指定它.有关详细信息,请参阅MSDN 您可能必须创建一个XmlWriter对象才能使用它,有关详细信息也在MSDN上:

 XmlWriter writer = XmlWriter.Create(Console.Out, settings);
Run Code Online (Sandbox Code Playgroud)

您还可以在XmlWriter中设置编码,XmlWriterSettings对象具有Encoding属性.