1

我遇到了一些奇怪的异常,例如 tmo = (testobjectt)value[i]; 这是“无法将'System.Xml.XmlNode []'类型的对象转换为system.type类型”。

关于这个问题的任何想法?唯一可用的解决方案是重新启动 Windows 服务,以便 UI 中的所有内容都可用。另一件事是我们在客户端和服务器之间确实有 API。

这是我正在使用的代码片段:

public class Testarray: ArrayList

     // Release resources
     if (rd != null)
     {
        rd.Close();
     }

     return retval;
  }


Assembly a = Assembly.GetAssembly(typeof(Testobject));
                  string myType = a.gettype;
                  string xml = xmlvalue;
DataModelObject dmo;
// Deserialize and process the object
                  Testarraycol = Testarray.Deserialize(xml, Type.type);
tmo= (Testobject)value[i];  // this is where the exception occurs

更新 是否在任何地方都需要任何无参数构造,我正在手动检查整个项目在序列化时丢失的任何地方?

4

1 回答 1

1

对于这个错误的原因,我最好的猜测是你依赖于col ObjectArray. 这不能保证。

可能,在一个简单的表示中,您的ObjectArray.Deserialize方法如下所示:

public static ObjectArray Deserialize(string xml, Type type)
{
    var s = new XmlSerializer(typeof(ObjectArray),
        new Type[] { type });
    var o = (ObjectArray)s.Deserialize(new StringReader(xml));
    return o;
}

但这意味着序列化xml中不属于Type type(方法的参数)的任何其他对象都将被反序列化为System.Xml.XmlNode[].

可能,错误发生在col[i]实际持有ViewObjectInfo.

如果您想确保这两种类型都被正确反序列化,请使用类似于以下内容的内容:

public static ObjectArray Deserialize(string xml, Type[] types)
{
    var s = new XmlSerializer(typeof(ObjectArray), types);
    var o = (ObjectArray)s.Deserialize(new StringReader(xml));
    return o;
}

并这样称呼它:

ObjectArray col = ObjectArray.Deserialize(xml, 
    new Type[] { typeof(DataModelObject), typeof(ViewObjectInfo) }
    );
dmo = (DataModelObject)col.OfType<DataModelObject>().Skip(i).First();

无论如何,如果您只需要反序列DataModelObject化对象并保留当前逻辑,则只需替换:

dmo = (DataModelObject)col[i];

dmo = (DataModelObject)col.OfType<DataModelObject>().Skip(i).First();

不要忘记,col[i]保证数组项的原始顺序匹配。

于 2013-02-27T17:22:22.450 回答