異なるタイプのXMLストリングを逆直列化したい場合、メソッドは入力パラメーターとしてストリングを持ち、5つのタイプのXMLストリングを受け入れます。異なるタイプのXMLストリングの逆シリアル化
現在、私は、タイプを見つけるためにstring.StartsWith
メソッドに基づいてXMLストリングを逆シリアル化するクラスを選択することを計画しています。
デシリアライズ用のクラスのタイプを見つける良い方法はありますか?
異なるタイプのXMLストリングを逆直列化したい場合、メソッドは入力パラメーターとしてストリングを持ち、5つのタイプのXMLストリングを受け入れます。異なるタイプのXMLストリングの逆シリアル化
現在、私は、タイプを見つけるためにstring.StartsWith
メソッドに基づいてXMLストリングを逆シリアル化するクラスを選択することを計画しています。
デシリアライズ用のクラスのタイプを見つける良い方法はありますか?
私が最初にお勧めするのは、タイプを見つけるために文字列を読む必要がないように、入力時にタイプを選択できるようにすることです。
しかし、あなたが本当にやりたければ、このようなことをすることができます。テストの目的で、私はMyClass
というクラスをシリアライズしました。私はすべて創造的です。
var input = @"<MyClass xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""><MyString>Scott</MyString></MyClass>";
var xml = new XmlDocument();
xml.LoadXml(input);
//xml could be null
//Get the tag name of the root element which is
//the name of the serialized type.
var typeName = xml.DocumentElement.Name;
//Try to create a type from that root element's name.
var type = Type.GetType(typeName);
//If it doesn't match a type then it will be null.
if (type != null)
{
//create an XmlSerializer for that type and deserialize the string.
var serializer = new XmlSerializer(type);
using (var sr = new StringReader(input))
{
var deserialized = serializer.Deserialize(sr);
}
}
これは、指定したとおりです。しかし今では、入力可能な文字列をいくつかのクラスのシリアライズで始めるように、object
(deserialized
)もタイプされていないので、次にそれをどうすればいいのかは分かりません。
文字列に基づいてC#タイプを推論するエレガントな方法があるかどうかを尋ねる場合は、私の答えは「あまりない」です。文字列の内容から型を推論するために、入力文字列を検査するためにあなたの好きな仕組みを使わなければなりません。
入力が何であるかを気にせず、xmldocumentでxpathを使って作業してください。あなたは、標準の[XmlSerializerを](https://msdn.microsoft.com/en-us/library/を使用している場合
internal class Converter
{
public T CovertXML<T>(string XMLString) where T:class
{
if (XMLString.ToLower().Contains(typeof(Type1).GetType().Name.ToLower()))
{
return XMLString.Deseralize<Type1>() as T;
}
//..etc etc.
return null;
}
}
internal class Type1
{
}
public static class StringExtensionMethods
{
public static T Deseralize<T>(this string Instance)
{
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
using (System.IO.StringReader sr = new System.IO.StringReader(Instance))
return (T)ser.Deserialize(sr);
}
}
:
私のお気に入りのC#クラス型検出メカニズムは次のようになりますsystem.xml.serialization.xmlserializer.aspx)、これはあなたのためにこれを行います。 – Blorgbeard