SORU
5 EKİM 2010, Salı


UTF-8 gibi bir nesne seri hale XML .NET

Uygun nesne imha kısaltma için kaldırıldı ama eğer bu bellekte UTF-8 olarak bir nesne kodlamak için en kolay yolu ise şok oldum. Daha kolay bir yolu yok mu olmalı?

var serializer = new XmlSerializer(typeof(SomeSerializableObject));

var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, System.Text.Encoding.UTF8);

serializer.Serialize(streamWriter, entry);

memoryStream.Seek(0, SeekOrigin.Begin);
var streamReader = new StreamReader(memoryStream, System.Text.Encoding.UTF8);
var utf8EncodedXml = streamReader.ReadToEnd();

CEVAP
5 EKİM 2010, Salı


Hayır StringWriter bir Ara MemoryStream kurtulmak için kullanabilirsiniz. Ancak, XML güç Encoding özelliği geçersiz kılar StringWriter Bir kullanmanız gerekir:

public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding
    {
         get { return Encoding.UTF8; }
    }
}

Sonra:

var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
    serializer.Serialize(writer, entry);
    utf8 = writer.ToString();
}

Belli ki sen-ebilmek yapmak Utf8StringWriter içine daha genel bir sınıf kabul eden herhangi bir kodlama kurucusu - ama benim tecrübelerime göre UTF-8 bugüne kadar en çok gerekli olan "özel" kodlama için StringWriter :)

Şimdi Jon Hanna dediği gibi, bu hala UTF-16 dahili olacak, ama muhtemelen bir noktada başka bir şey için değil, ikili veri dönüştürmek için... geçmek için gidiyoruzbuXML bildirimi "" kodlaması. utf-8 belirtmek çünkü yukarıdaki dize UTF-8 dönüştürmek bayt, ve her şey iyi olacak - kullanabilirsiniz noktası

EDİT: kısa ama tam bu göstermek için BİR örnek çalışma:

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
        {
            get { return Encoding.UTF8; }
        }
    }
}

Sonuç:

<?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" ne istedik, inanıyorum. ilan kodlama not

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • george sarintzotis

    george sarin

    2 Aralık 2007
  • infiniTuts

    infiniTuts

    18 Ocak 2012
  • oHeymarvin

    oHeymarvin

    11 Temmuz 2013