SORU
14 EKİM 2009, ÇARŞAMBA


Kullanarak XML Seri hale getirme için StringWriter

Şu anda kolay bir şekilde nesneler (C# 3) seri hale getirmek için arıyorum.

Bazı örnekler araştırdım ve şöyle bir şey geldi:

MemoryStream memoryStream = new MemoryStream ( );
XmlSerializer xs = new XmlSerializer ( typeof ( MyObject) );
XmlTextWriter xmlTextWriter = new XmlTextWriter ( memoryStream, Encoding.UTF8 );
xs.Serialize ( xmlTextWriter, myObject);
string result = Encoding.UTF8.GetString(memoryStream .ToArray());

Kendime sordum question bunu okuduktan sonra, neden kullanarak StringWriter değil mi? Çok daha kolay gibi görünüyor.

XmlSerializer ser = new XmlSerializer(typeof(MyObject));
StringWriter writer = new StringWriter();
ser.Serialize(writer, myObject);
serializedValue = writer.ToString();

Başka bir Sorun, ilk örnek, SQL Server bir XML sütun 2005 DB içine yazamam XML oluşturulur.

İlk soru: daha sonra bir tel gibi? ihtiyacım olduğunda bir Nesne seri hale getirmek için StringWriter kullanın etmemem için bir neden var. Ben hiç bir sonuç googling zaman StringWriter kullanarak bulundu.

Eğer iyi ve doğru bir yol olacağını StringWriter (sebep ne olursa olsun) ile yapmalısın. ikincisi, tabii ki:

< / ^ hr .

Ayrıca:

Zaten her iki cevap da bahsettiği gibi, daha fazla sorun DB XML içine giderim.

Veritabanına yazma sırasında aşağıdaki özel durum var:

Sistem.Veri.SqlClient.SqlException: XML ayrıştırma: 1, 38 karakter,çizgi kodlama geçiş yapılamıyor

Dize için

<?xml version="1.0" encoding="utf-8"?><test/>

Dize XmlTextWriter oluşturulan aldım ve sadece xml olarak oraya koy. Bu bir iş (DB içine manuel ekleme ile hiçbir zaman vermedi.

Kodlama ile manuel ekleme (sadece TAKIN ... yazma ) çalıştım daha sonra="utf-16" da başarısız oldu. Kodlama tamamen kaldırmak sonra çalıştı. Bu sonucun ardından StringWriter kod ve viyola için geri değiştirdim işe yaradı.

Sorun: gerçekten anlamıyorum.

Christian Hayter: bu testler İle DB yazmak için utf-16 kullanmalıyım emin değilim. UTF-16 (xml etiketi) için kodlama ayarı o zaman işe yaramaz?

CEVAP
14 EKİM 2009, ÇARŞAMBA


Bir XML belgesi serialising .NET dize, kodlama UTF-16 için ayarlanmış olması gerekir. Dizeleri UTF-16 gibi dahili olarak saklanır, bu mantıklı olan tek kodlama. Eğer farklı bir kodlama verileri saklamak istiyorsanız, bir bayt dizisi yerine kullanın.

SQL Server benzer bir prensip üzerinde çalışır; herhangi bir dize xml bir sütuna geçti UTF-16 olarak kodlanmış olmalıdır. SQL Server XML bildirimi UTF-16 belirtmiyor herhangi bir dize reddeder. Eğer XML bildirimi varsa, o zaman XML standart SQL Server de reddeder bu yüzden UTF-8, varsayılan gerektirir.

Bunu akılda tutarak, burada dönüşüm yapmak için bazı yardımcı yöntemler.

public static string Serialize<T>(T value) {

    if(value == null) {
        return null;
    }

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Encoding = new UnicodeEncoding(false, false); // no BOM in a .NET string
    settings.Indent = false;
    settings.OmitXmlDeclaration = false;

    using(StringWriter textWriter = new StringWriter()) {
        using(XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings)) {
            serializer.Serialize(xmlWriter, value);
        }
        return textWriter.ToString();
    }
}

public static T Deserialize<T>(string xml) {

    if(string.IsNullOrEmpty(xml)) {
        return default(T);
    }

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    XmlReaderSettings settings = new XmlReaderSettings();
    // No settings need modifying here

    using(StringReader textReader = new StringReader(xml)) {
        using(XmlReader xmlReader = XmlReader.Create(textReader, settings)) {
            return (T) serializer.Deserialize(xmlReader);
        }
    }
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eddie Bravo

    Eddie Bravo

    17 EKİM 2006
  • Jaclyn W

    Jaclyn W

    5 Mayıs 2006
  • Mismag822 - The Card Trick Teacher

    Mismag822 -

    18 EKİM 2008