2016-09-21 17 views
0

は、私はすでにたくさんとを探索し解決策を見つけることができないと私はXML文字列にオブジェクトをシリアライズし、C#を使用してオブジェクトに戻って、それをデシリアライズしていますXMLデシリアライズエンコードの問題

正しいアプローチに決定することができません。シリアル化の後のXML文字列は先頭に?を追加します。私はエラーを取得していますオブジェクトに戻ってdezerializeすると、XML文書に誤りがあります(1、1)

?<?xml version="1.0" encoding="utf-16"?> 

シリアルコード:

string xmlString = null; 
MemoryStream memoryStream = new MemoryStream(); 
XmlSerializer xs = new XmlSerializer(typeof(T)); 
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("abc", "http://example.com/abc/"); 
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream,Encoding.Unicode); 
xs.Serialize(xmlTextWriter, obj, ns); 
memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
xmlString = ConvertByteArrayToString(memoryStream.ToArray()); 

ConvertByteArrayToString:

UnicodeEncoding encoding = new UnicodeEncoding(); 
    string constructedString = encoding.GetString(characters); 

直列化復元コード:

XmlSerializer ser = new XmlSerializer(typeof(T)); 
StringReader stringReader = new StringReader(xml); 
XmlTextReader xmlReader = new XmlTextReader(stringReader); 
object obj = ser.Deserialize(xmlReader); 
xmlReader.Close(); 
stringReader.Close(); 
return (T)obj; 

私がエンコーディングに間違っていることを知りたいのですが、ほとんどの場合に有効な解決策が必要です。おかげ

答えて

0

使用して、機能、次のシリアライズとデシリアライズ

public static string Serialize<T>(T dataToSerialize) 
{ 
    try 
    { 
     var stringwriter = new System.IO.StringWriter(); 
     var serializer = new XmlSerializer(typeof(T)); 
     serializer.Serialize(stringwriter, dataToSerialize); 
     return stringwriter.ToString(); 
    } 
    catch 
    { 
     throw; 
    } 
} 

public static T Deserialize<T>(string xmlText) 
{ 
    try 
    { 
     var stringReader = new System.IO.StringReader(xmlText); 
     var serializer = new XmlSerializer(typeof(T)); 
     return (T)serializer.Deserialize(stringReader); 
    } 
    catch 
    { 
     throw; 
    } 
} 
0

のためにあなたのシリアライズされたXMLは、初めにUnicode byte-order markを含み、デシリアライザが失敗した場所です。

は、BOMを削除するには、デフォルト Encoding.Unicodeを抑制BOMをコードする代わりに使用して、別のバージョンを作成する必要があります。ここでは第二 false

new XmlTextWriter(memoryStream, new UnicodeEncoding(false, false)) 

BOMは文字列の先頭に付加されている防ぎます。