C#とVB.NET(3.5)の混在したWebソリューションがあります(注:いくつかのvb.netファイルにはOption Strict Offがあります)。私たちのコードは、DotNetNuke 4.8の中でモジュールとして動作します。特定の条件下では、我々のアプリケーションは、この方法でクラッシュします:シリアライゼーションの投げArgumentException/InvalidCastException:デバッグのアプローチが必要
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString
その例外では省略メッセージは次のとおりです。
スタックトレース内のどこにもSystem.ArgumentException: "Error serializing value XYZ of type XYZ."
System.InvalidCastException: "Unable to cast object of type 'System.Int64'
to 'System.String'"
が我々のコードで、それが終わるだけでシステムのコードですコードからタイプXYZ
をシリアル化できませんでした。これは私がブレークポイントを打つことはできませんし、XYZの正確なプロパティが問題であるデバッグを意味します。スタックトレースプロパティは空ですが、メッセージにと略記スタックトレースです:
DotNetNuke.Services.Exceptions.PageLoadException: "Error serializing value 'XYZ' of type 'XYZ.'"
System.ArgumentException: "Error serializing value 'XYZ' of type 'XYZ.'"
System.InvalidCastException: "Unable to cast object of type 'System.Int64' to type 'System.String'. "
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString(NameInfo memberNameInfo, NameInfo typeNameInfo, Object stringObject)
// ...... etc.........
at System.Web.UI.Page.SaveAllState()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
// --- End of inner exception stack trace
このトレースのすべての関連する行はSystem.
で始まります。上の行はDotNetNukeです。しかし、最初の答えの提案に続いて私はDotNetNuke(4.8)コードを自分でコンパイルし、そのコードはServer.GetLastError
で、実際の値やプロパティ名がシリアル化されていることを知らないInnerExceptionとしてInvalidExceptionを示しています。
質問はです:シリアライザで問題が発生しているフィールドと値を知る方法を教えてください。この問題を調査しながら、頭に浮かんだ
関連するいくつかの質問/問題:私はMSDNのFormatters.Binary一部を見れば、コメントで提案されているように
- 私は(ObjectWriterバイナリための内部だと思いたいです、 赤)?
- .NETを使用してInt64をStringにキャストしてもどうして失敗するのですか?言い換えれば、Int64のどの値が文字列に変換されない可能性がありますか?しかし、コメントで指摘されているように、Int64はStringsに簡単に変換できますが、キャストするのは別の問題です。
- Serializeメソッドは、このArgumentExceptionまたはInvalidCastExceptionが(例外セクションで)発生する可能性があることを通知しません。
私は、任意の不規則性を確認するためにILDASMにそのクラスのプロパティのXYZ
と種類を調査してみましたが、いずれも見つけることができませんでした。
'(文字列)42L'はInvalidCastExceptionをスローし、その他のInt64値もスローします。 Int64値は 'string'にキャストできません。 ( 'Convert.ToString(42L)'や '42L.ToString()'を使って**文字列に変換することができます) – dtb
'ObjectWriter'は、' System.Runtime 'の 'internal'クラスです。 Serialization.Formatters.Binary'名前空間。 – dtb
両方の有益なコメントありがとう!意味をなさないこの部分の質問を更新すると思います。 – Jeroen