XML сериализация, кодирование - PullRequest
14 голосов
/ 08 февраля 2011
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();
   }
} 

взято из http://support.microsoft.com/kb/815813

1)

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType());

Что делает эта строка? Что такое 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">

вместо

<?xml version="1.0" encoding="IBM437"?>
 <clsPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3
 .org/2001/XMLSchema">

или не включать тип кодировки вообще?

Ответы [ 4 ]

54 голосов
/ 08 февраля 2011

Если вы передаете сериализатору XmlWriter, вы можете управлять некоторыми параметрами, такими как кодировка, пропускать ли объявление (например, для фрагмента) и т. Д.

Это не предназначено для того, чтобы быть исчерпывающим руководством, но альтернативой, чтобы вы могли видеть, что происходит, и то, что не просто утешает в первую очередь.

Обратите внимание, что если вы создадите свой XmlWriter с помощью StringBuilder вместо MemoryStream, ваш xml будет игнорировать вашу кодировку и получится в кодировке utf-16. См. Сообщение в блоге написание XML с кодировкой utf8 для получения дополнительной информации.

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()
}
12 голосов
/ 08 февраля 2011

1) Функция GetType () возвращает объект Type, представляющий тип вашего объекта, в данном случае класс clsPerson. Вы также можете использовать typeof(clsPerson) и получить тот же результат. Эта строка создает объект XmlSerializer для вашего конкретного класса.

2) Если вы хотите изменить кодировку, я считаю, что есть функция переопределения Serialize (), которая позволяет вам указать это. Подробнее см. MSDN . Возможно, вам придется создать объект XmlWriter, чтобы использовать его, хотя подробности об этом также указаны в MSDN :

 XmlWriter writer = XmlWriter.Create(Console.Out, settings);

Вы также можете установить кодировку в XmlWriter, у объекта XmlWriterSettings есть свойство Encoding.

2 голосов
/ 27 ноября 2017

Я взял решение, предложенное здесь @ robert-paulson для аналогичной вещи, которую пытался сделать, и получил строку XmlSchema.По умолчанию возвращается как utf-16.Однако, как уже упоминалось, решение здесь страдает от ошибки чтения закрытого потока.Поэтому я использую возможность публикации рефактора как метода расширения с твиком, упомянутым @Liam для перемещения блока using.

    public static string ToXmlString(this XmlSchema xsd)
    {
        var xmlWriterSettings = new XmlWriterSettings
        {
            Indent = true,
            OmitXmlDeclaration = false,
            Encoding = Encoding.UTF8
        };

        using (var memoryStream = new MemoryStream())
        {
            using (var xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
            {
                xsd.Write(xmlWriter);
            }

            memoryStream.Position = 0; 
            using (var sr = new StreamReader(memoryStream))
            {
                return sr.ReadToEnd();
            }
        }
    }
2 голосов
/ 08 февраля 2011

1) Это создает XmlSerializer для класса clsPerson.

2) кодировка - IBM437, потому что это форма для потока Console.Out.

PS: венгерская нотация не является предпочтительнойв C #;просто назовите свой класс Person.

...