아니요, a StringWriter
를 사용 하여 중간 MemoryStream
. 그러나 XML로 강제 StringWriter
하려면 Encoding
속성 을 재정의하는를 사용해야 합니다.
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
또는 아직 C # 6을 사용하지 않는 경우 :
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
그때:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
분명히 Utf8StringWriter
생성자에서 모든 인코딩을 허용하는보다 일반적인 클래스로 만들 수 있습니다. 하지만 내 경험상 UTF-8은 지금까지 가장 일반적으로 필요한 "사용자 지정"인코딩입니다. StringWriter
:)
이제 Jon Hanna가 말했듯이 이것은 내부적으로 여전히 UTF-16이지만, 아마도 당신은 그것을 이진 데이터로 변환하기 위해 어떤 시점에서 다른 것에 전달할 것입니다 ... 그 시점에서 위의 문자열을 사용할 수 있습니다. 이를 UTF-8 바이트로 변환하면 XML 선언이 인코딩으로 "utf-8"을 지정하기 때문에 모두 잘 될 것입니다.
편집 :이 작동을 보여주는 짧지 만 완전한 예 :
using System;
using System.Text;
using System.IO;
using System.Xml.Serialization;
public class Test
{
public int X { get; set; }
static void Main()
{
Test t = new Test();
var serializer = new XmlSerializer(typeof(Test));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, t);
utf8 = writer.ToString();
}
Console.WriteLine(utf8);
}
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
}
결과:
<?xml version="1.0" encoding="utf-8"?>
<Test xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<X>0</X>
</Test>
우리가 원했던 "utf-8"의 선언 된 인코딩에 주목하십시오.