1

tmo = (testobjectt)value[i]; のような例外が発生しています。これは、「タイプ 'System.Xml.XmlNode[]' のオブジェクトをタイプ system.type にキャストできません」です。

この問題についてのアイデアはありますか? 利用可能な唯一の解決策は、Windows サービスを再起動して、UI ですべてを利用できるようにすることです。もう 1 つは、クライアントとサーバーの間に 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 に答える