XSDファイルのツールxsd.exeから取得したWebserviceType
という名前のクラスがあります。
ここで、WebServiceType
オブジェクトのインスタンスを文字列に逆シリアル化したいと思います。これどうやってするの?
MethodCheckType
オブジェクトには、パラメーターとしてWebServiceType
配列があります。
最初の試みは、XmlSerializer
とStringWriter
でシリアル化したようなものでした(シリアル化中はStringReader
を使用しました)。
これは、WebServiceType
オブジェクトをシリアル化する方法です。
XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType));
MethodCheckType output = null;
StringReader reader = null;
// catch global exception, logg it and throw it
try
{
reader = new StringReader(path);
output = (MethodCheckType)serializer.Deserialize(reader);
}
catch (Exception)
{
throw;
}
finally
{
reader.Dispose();
}
return output.WebService;
編集:
別の言葉で言ってもいいかもしれません。このMethodCheckType
オブジェクトのインスタンスを取得している一方で、このオブジェクトをシリアル化したXMLドキュメントを取得しています。次に、このインスタンスを文字列形式のXMLドキュメントに変換します。この後、(XMLドキュメントの)両方の文字列が同じかどうかを証明する必要があります。これは、XMLドキュメントをStringReader
に読み取り、それをMethodCheckType
オブジェクトにシリアル化する最初のメソッドのユニットテストを行うためです。
以下は、両方の方法の変換方法です。 this =クラスのインスタンス
public string ToXML()
{
using(var stringwriter = new System.IO.StringWriter())
{
var serializer = new XmlSerializer(this.GetType());
serializer.Serialize(stringwriter, this);
return stringwriter.ToString();
}
}
public static YourClass LoadFromXMLString(string xmlText)
{
using(var stringReader = new System.IO.StringReader(xmlText))
{
var serializer = new XmlSerializer(typeof(YourClass ));
return serializer.Deserialize(stringReader) as YourClass ;
}
}
これは非常に古い投稿であることに気づきましたが、LBの回答を見た後、受け入れられた回答をどのように改善し、自分のアプリケーションに汎用的にすることができるかを考えました。ここに私が思いついたものがあります:
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;
}
}
これらのメソッドは、静的ヘルパークラスに配置できるようになりました。つまり、シリアル化する必要のあるすべてのクラスにコードが重複することはありません。
public static string Serialize(object dataToSerialize)
{
if(dataToSerialize==null) return null;
using (StringWriter stringwriter = new System.IO.StringWriter())
{
var serializer = new XmlSerializer(dataToSerialize.GetType());
serializer.Serialize(stringwriter, dataToSerialize);
return stringwriter.ToString();
}
}
public static T Deserialize<T>(string xmlText)
{
if(String.IsNullOrWhiteSpace(xmlText)) return default(T);
using (StringReader stringReader = new System.IO.StringReader(xmlText))
{
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stringReader);
}
}
これは私のソリューションです。リストオブジェクトの場合、このコードを使用してxmlレイアウトに変換できます。 KeyFatherが主要タグであり、KeySonがForechの開始点です。
public string BuildXml<T>(ICollection<T> anyObject, string keyFather, string keySon)
{
var settings = new XmlWriterSettings
{
Indent = true
};
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder, settings))
{
writer.WriteStartDocument();
writer.WriteStartElement(keyFather);
foreach (var objeto in anyObject)
{
writer.WriteStartElement(keySon);
foreach (PropertyDescriptor item in props)
{
writer.WriteStartElement(item.DisplayName);
writer.WriteString(props[item.DisplayName].GetValue(objeto).ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
}
writer.WriteFullEndElement();
writer.WriteEndDocument();
writer.Flush();
return builder.ToString();
}
}