web-dev-qa-db-ja.com

XMLシリアル化、エンコード

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/81581 から取得

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">

またはエンコーディングタイプをまったく含めないのですか?

17
001

1)GetType()関数は、オブジェクトのタイプを表すTypeオブジェクト(この場合はクラスclsPerson)を返します。 typeof(clsPerson)を使用しても同じ結果が得られます。この行により、特定のクラスのXmlSerializerオブジェクトが作成されます。

2)エンコーディングを変更したい場合は、それを指定できるSerialize()関数のオーバーライドがあると思います。詳細は [〜#〜] msdn [〜#〜] を参照してください。ただし、XmlWriterオブジェクトを作成して使用する必要がある場合がありますが、その詳細は [〜#〜] msdn [〜#〜] :にもあります。

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

XmlWriterでエンコーディングを設定することもできます。XmlWriterSettingsオブジェクトにはEncodingプロパティがあります。

14
WildCrustacean

シリアライザにXmlWriterを渡すと、エンコーディングなどの一部のパラメータ、宣言を省略するかどうか(フラグメントなど)などを制御できます。

これは決定的なガイドではありませんが、何が起こっているのか、そして最初にコンソールに移動するだけではないことを確認できるようにするための代替手段です。

また、MemoryStreamではなくStringBuilderを使用してXmlWriterを作成した場合、xmlはエンコードを無視し、utf-16エンコードとして出力されることにも注意してください。詳細については、ブログ投稿 tf8エンコーディングで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()
}
55
Robert Paulson

ここで@ robert-paulsonが提供するソリューションを使用して、XmlSchemaの文字列を取得しようとしていたのと同様のことを行いました。デフォルトでは、utf-16として返されます。ただし、前述のように、ここでの解決策にはStream ClosedReadエラーが発生します。そのため、@ Liamによって言及されたtweekを使用して、リファクタリングを拡張メソッドとしてポストする自由を利用して、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
DubMan

1)これにより、クラスclsPersonのXmlSerializerが作成されます。

2)Console.Outストリームの形式であるため、エンコードはIBM437です。

PS:C#ではハンガリアン記法は推奨されません。クラスにPersonという名前を付けるだけです。

2