2011-02-03 19 views
20

errori Deserilization di .NET sono abbastanza generici, per esempio qualcosa di simile:Come eseguire il debug degli errori di deserializzazione in .NET?

System.ArgumentException: Oggetto tipo 'System.Uri' non può essere convertito digitare 'System.String'.

È chiaro che abbiamo cambiato il tipo di una proprietà di un oggetto, ma ci sono come 10-15 diverse classi di questo oggetto serializzato, quindi è veramente difficile capire quale abbiamo cambiato o che impegnano disordine questo up .

È comunque necessario ottenere informazioni su quale proprietà in quale classe (o almeno in quale classe) causa effettivamente questo errore? C'è qualche strumento esterno o modi noti per farlo?

P.S. Prima che qualcuno inizi a dirmi perché non dovrei usare il serializzatore binario o perché dovrei X, Y invece ecc. Per compatibilità con le versioni precedenti, ti preghiamo di salvare i consigli su quelli. Sono consapevole di tutti quelli, ma non è questa la domanda.

+4

hai visto InnerException se non avete ulteriori informazioni? – DesignFirst

+0

10-15 non sembra un numero enorme a scopo di debug; Non conosco un modo semplice per eseguire il debug di questo elemento. –

+0

@Marc Gravell: Penso che @dr.il male significa che l'istanza essendo deserializzata ha riferimenti a 10-15 altre classi distinte, tutte delle quali (inclusa la radice) possono avere proprietà 'N' (anche con una classe, si hanno proprietà' N') che è indeterminata, in modo che può potenzialmente essere un gran numero di proprietà da attraversare. – casperOne

risposta

1

C'è un paio di cose diverse che puoi fare, nessuna delle quali è eccezionale. Soprattutto con la serializzazione binaria. È possibile aggiungere la gestione della serializzazione personalizzata con l'interfaccia ISerializable, che consentirebbe di passare attraverso il processo di deserializzazione nel debugger.

Avete considerato di passare alla serializzazione Xml per scopi di sviluppo/debug? Ci sono alcuni altri hook che puoi usare con la serializzazione Xml. Ma sembra che non funzioni per te, dato che probabilmente stai utilizzando un'interfaccia remota o vecchi dati binari memorizzati su disco che devi leggere.

Ma ancora più semplice sarebbe esaminare i registri del sistema di controllo del codice sorgente per il metodo con il tipo modificato.

+0

Attualmente stiamo controllando la versione precedente per risolvere il problema, tuttavia speravo di trovare uno strumento intelligente per aiutarmi. Forse quando gli do le mie DLL può deserilizzare e visualizzare l'oggetto. Troppo ottimista, eh? :) –

+0

Sì, ci sono molti posti in cui le eccezioni .Net contengono poche o nessuna informazione. Vera vergogna Le classi di configurazione generano anche messaggi di eccezione molto criptici quando si hanno classi personalizzate. Almeno sai che è un cambio di tipo, che ti dà un buon vantaggio. – MonkeyWrench

8

Se si attiva il debug nel codice framework (vedere il collegamento this) e quindi si preme ctrl + mai + + e si selezionano tutte le eccezioni di codice gestito, l'errore verrà visualizzato nella riga di origine effettiva che non riesce. Dovresti essere in grado di utilizzare la traccia dello stack per scoprire quale parte dell'oggetto stava cercando di deserializzare in quel punto.

Non è facile, ma è così che abbiamo finito per farlo.

+0

L'aggiunta di eccezioni di prima scelta e l'uso di simboli come indicato sopra rappresentano un ottimo approccio. –

+0

OK, questa mi sembra un'ottima idea, la controllerò. –

1

L'analisi della traccia di Stack interno può essere utile. Il serializzatore genera una classe specifica per gestire il tipo che si desidera serializzare/deserializzare.

Solo osservando i nomi delle funzioni delle funzioni coinvolte nello stacktrace è possibile rintracciare quale nodo nodo si sta interrompendo.

Questo aiuta a restringere il punto in cui si trova il problema, specialmente con file XML complessi di grandi dimensioni.

Esempio:

at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
    at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
    at System.Xml.XmlConvert.ToInt32(String s) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read13_Item(Boolean isNullable, Boolean checkType) //Tells you the issue is on the RootNodeSubNodeSubSubNode on an item withing it. 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read17_RootNodeSubNodeSubSubNode(Boolean isNullable, Boolean checkType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read26_RootNodeSubNode(Boolean isNullable, Boolean checkType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read50_RootNode(Boolean isNullable, Boolean checkType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read51_RootNode() 
+2

come sapere quale attributo stava accedendo. Sto ottenendo La stringa di input non era nel formato corretto. Ho un grande file xml che ha molti attributi. Voglio sapere quale ha causato il problema – Ziggler

Problemi correlati