2012-02-27 12 views
20

私はこの拡張メソッドXmlWriterは常にutf-16エンコーディングを出力していますか?

public static string SerializeObject<T>(this T value) 
    { 
     var serializer = new XmlSerializer(typeof(T));   
     var settings = new XmlWriterSettings 
         { 
         Encoding = new UTF8Encoding(true), 
         Indent = false, 
         OmitXmlDeclaration = false, 
         NewLineHandling = NewLineHandling.None 
         }; 

     using(var stringWriter = new StringWriter()) 
     { 
      using(var xmlWriter = XmlWriter.Create(stringWriter, settings)) 
      { 
       serializer.Serialize(xmlWriter, value); 
      } 

      return stringWriter.ToString(); 
     } 
    } 

を持っているが、私はこれを呼び出すたびに、<?xml version="1.0" encoding="utf-16"?>すなわち、指定されたutf-16のエンコーディングを持っています。私は間違って何をしていますか?

+0

可能複製(http://stackoverflow.com/questions/427725/ [他のことUTF-16のXmlWriterとをXMLにencoding属性を置く方法?] xml-other-that-utf-16-with-xmlwriter) –

+0

これは詐欺機であることに気づきました。クローズするには投票してください。 –

答えて

10

文字列はUTF-16なので、StringWriterに書き込むと常にUTF-16が使用されます。それがあなたが望むものでないなら、他のTextWriterの派生クラスを、好きなエンコーディングで使用してください。

+1

シェークスヘッド。それでは、XmlWriterSettingsにエンコーディングプロパティを持つのはどういうことでしょうか。はい、文字列はUTF-16ですが、文字列にシリアライズする場合、ファイルや何かに書き込むことになるため、xml宣言のエンコーディング属性をファイルの実際のエンコーディングと一致させたいこれはUTF-16ではありません。 – bbsimonbb

+0

@user文字列にシリアライズしないで直接ストリームに行きます。 –

+0

OK。それは理にかなっています。 – bbsimonbb

14

私が知る限り、StringWriterクラスは、文字列にシリアル化するときには常にUTF 16エンコーディングを使用します。あなたは別のエンコーディングを受け入れ、独自のオーバーライドクラスを記述することができます。

public class StringWriterWithEncoding : StringWriter 
{ 
    private readonly Encoding _encoding; 

    public StringWriterWithEncoding() 
    { 
    } 

    public StringWriterWithEncoding(IFormatProvider formatProvider) 
     : base(formatProvider) 
    { 
    } 

    public StringWriterWithEncoding(StringBuilder sb) 
     : base(sb) 
    { 
    } 

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider) 
     : base(sb, formatProvider) 
    { 
    } 


    public StringWriterWithEncoding(Encoding encoding) 
    { 
     _encoding = encoding; 
    } 

    public StringWriterWithEncoding(IFormatProvider formatProvider, Encoding encoding) 
     : base(formatProvider) 
    { 
     _encoding = encoding; 
    } 

    public StringWriterWithEncoding(StringBuilder sb, Encoding encoding) 
     : base(sb) 
    { 
     _encoding = encoding; 
    } 

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider, Encoding encoding) 
     : base(sb, formatProvider) 
    { 
     _encoding = encoding; 
    } 

    public override Encoding Encoding 
    { 
     get { return (null == _encoding) ? base.Encoding : _encoding; } 
    } 
} 

だから、あなたの代わりにこれを使用することができます:

using(var stringWriter = new StringWriterWithEncoding(Encoding.UTF8)) 
{ 
    ... 
} 
+0

Big +1、うまく動作します、 ありがとうございました。 –

1

あなたはオーバーライドされたエンコードのプロパティを持っているにStringWriterから新しいクラスを派生する必要があります。

1

受け入れられる回答によれば、StringWriterは、デフォルトではUTF-16(Unicode)であり、デザインです。最後にUTF-8文字列を取得することでやりたい場合は、2つの方法があります。

解決策1 done):テキストファイルにダンプしてから、のファイルを削除してください(小さなファイルにも適しています。もしこれをやりたいのであれば、ちょうどそれができたことを示したかっただけです)。

public static string SerializeObject<T>(this T value) 
{ 
    var serializer = new XmlSerializer(typeof(T));   
    var settings = new XmlWriterSettings 
        { 
        Encoding = new UTF8Encoding(true), 
        Indent = false, 
        OmitXmlDeclaration = false, 
        NewLineHandling = NewLineHandling.None 
        }; 


    using(var xmlWriter = XmlWriter.Create("MyFile.xml", settings)) 
    { 
     serializer.Serialize(xmlWriter, value); 
    } 

    XmlDocument xml = new XmlDocument(); 
    xml.Load("MyFile.xml"); 
    byte[] bytes = Encoding.UTF8.GetBytes(xml.OuterXml);   
    File.Delete("MyFile.xml"); 

    return Encoding.UTF8.GetString(bytes); 

} 

溶液#2(より良い、より簡単に、よりエレガントな解決策!):あなたはそれを持っているように、それを実行してくださいStringWriterを使用しているが、そのを使用プロパティは、UTF-8に設定します

public static string SerializeObject<T>(this T value) 
{ 
    var serializer = new XmlSerializer(typeof(T));   
    var settings = new XmlWriterSettings 
        { 
        Encoding = new UTF8Encoding(true), 
        Indent = false, 
        OmitXmlDeclaration = false, 
        NewLineHandling = NewLineHandling.None 
        }; 

    using(var stringWriter = new StringWriter(Encoding.UTF8)) 
    { 
     using(var xmlWriter = XmlWriter.Create(stringWriter, settings)) 
     { 
      serializer.Serialize(xmlWriter, value); 
     } 

     return stringWriter.ToString(); 
    } 
} 
+0

私は何かが不足していますか? StringWriter'は、エンコーディングプロパティをコンストラクタ引数として受け取っていないようです。 – crush

関連する問題