使用动态类型/将字符串转换为System.Type来反序列化XML

时间:2009-06-05 00:42:59

标签: vb.net xml-serialization

嗯,我不确定我是否正确地提出了这个问题,或者我是否正确地提出这个问题,但是这里有。

我有一个存储在数据库中的序列化对象(用XML格式),以及一个表示类型的字符串/ varchar。

现在我这样做:(因为我有不同类型的数量有限)

Dim deserializer as XmlSerializer
If datatable("type") = "widget1" then 
     deserializer = new XmlSerializer(GetType(Widget1))
elseif datatable("type") = "widget2" then 
     deserializer = new XmlSerializer(GetType(Widget2))
...

我想做像

这样的事情
Dim deserializer as XmlSerializer
deserializer = new XmlSerializer(MagicallyConvertToSystemDotType(datatable("type"))

我在这里咆哮错误的树吗?

3 个答案:

答案 0 :(得分:2)

您是否尝试过使用Type.GetType?这将获取一个字符串参数并返回该名称的类型。您可能需要向其提供有关简单名称“小部件”的更多信息,以及更多有关全名的信息。但是从你的示例中看,它们应该都具有相同的命名空间,因此不应该是一个很大的障碍。

答案 1 :(得分:0)

另一个选项,如果你想要一个真正的关键字Type,而不是一个变量类型正在使用类似的东西(对不起,我正在使用C#,我太累了,不能进行VB转换):

method in XmlSerializer like Deserialize(typestring, object);
method in XmlSerializer like Deserialize<T>(object);


public void Deserialize(string typestring, object obj)
{
  MethodInfo deserialize = typeof(XmlSerializer)
      .GetMethod("Deserialize", BindingFlags.Instance | BindingFlags.Public)
      .MakeGenericMethod(new Type[] { Type.GetType(typestring) });
  deserialize.Invoke(this, new[] { obj });
}

答案 2 :(得分:0)

具体来说,我认为你在这里寻找这个代码(注意:我在VB.Net中工作不多,所以我希望语法上的所有内容都正确):

VB.Net:

// Get the type of object being deserialized.
Dim t as Type = Type.GetType(typeNameString);
// Make a new instance of the object.
Dim o as Object = Activator.CreateInstance(t);

C#:

// Get the type of object being deserialized.
Type t = Type.GetType(typeNameString);
// Make a new instance of the object.
object o = Activator.CreateInstance(t);

编辑(2009年10月26日,格林威治标准时间-0600 15:10):Type.GetType(字符串typeNameString)方法并不总是将类型识别为完全限定名称。确保在参数字符串中包含尽可能多的信息符合您的最佳利益,如下所示:

VB.Net/C#:

typeNameString = objectSerialized.GetType().Namespace + ", " + objectSerialized.GetType().Name + ", " + objectSerialized.GetType().Assembly.FullName

不太具体,我遇到了同样的问题,经过大量的研究,我终于找到了一个很好的解决方案来动态处理所有 大多数。我已经将整个源代码发布到一个类,该类能够使用Reflection对所有类型的对象 不包含泛型或数组进行序列化和反序列化。随意拿它,并将其作为自己的。 如果有人决定添加对泛型和数组的处理,请向我发送更新的副本,以便我可以将其发布回我的博客(并且你会获得荣誉奖; - )......)。它会递归地序列化所有内容,并且还有一些特殊的编码用于枚举。

看看是否涵盖了您正在寻找的所有内容:

http://maxaffinity.blogspot.com/2009/10/serialize-objects-manually.html

〜的md5sum〜

编辑(2009年10月27日14:38 GMT-0600):纠正了我博客上有关课程的一些错误信息。