モジュールとして 5 つの異なるライブラリを使用するプロジェクトに取り組んでいます。私の仕事は、これらのライブラリの 1 つから別のライブラリを使用して、この情報を保存およびロードすることです。保存する機能を作成しましたが、データのロード/逆シリアル化により、Inner NullReferenceException が発生します。スタック トレースは次のとおりです。
System.Reflection.TargetInvocationException
HResult=0x80131604
Message=Exception has been thrown by the target of an invocation.
Source=mscorlib
StackTrace:
at System.RuntimeMethodHandle.SerializationInvoke(IRuntimeMethodInfo method, Object target, SerializationInfo info, StreamingContext& context)
at System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context) in f:\dd\ndp\clr\src\BCL\system\runtime\serialization\objectmanager.cs:line 884
at System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder) in f:\dd\ndp\clr\src\BCL\system\runtime\serialization\objectmanager.cs:line 283
at System.Runtime.Serialization.ObjectManager.DoFixups() in f:\dd\ndp\clr\src\BCL\system\runtime\serialization\objectmanager.cs:line 935
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) in f:\dd\ndp\clr\src\BCL\system\runtime\serialization\formatters\binary\binaryobjectreader.cs:line 179
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) in f:\dd\ndp\clr\src\BCL\system\runtime\serialization\formatters\binary\binaryformatter.cs:line 197
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream) in f:\dd\ndp\clr\src\BCL\system\runtime\serialization\formatters\binary\binaryformatter.cs:line 111
at WarehouseDistribution.SimulationForm.btnLoad_Click(Object sender, EventArgs e) in C:\Users\anast\Desktop\Final Product\WarehouseDistribution\SimulationForm.cs:line 650
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WarehouseDistribution.Program.Main() in C:\Users\anast\Desktop\Final Product\WarehouseDistribution\Program.cs:line 19
Inner Exception 1:
NullReferenceException: Object reference not set to an instance of an object.
私は、私を助ける可能性のある他の多くのスレッドを調べて、次のようなことを試しました。およびBinaryFormatter.Deserialize は、ILMerge の後に「アセンブリが見つかりません」が、何も機能しませんでした。
指定されたファイルを逆シリアル化するメソッドの要点は次のとおりです。
IFormatter formatter = new BinaryFormatter();
fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
importExporter = (ImportExporter)formatter.Deserialize(fs); //loads the saved ImportExporter
panel1.BackgroundImage = importExporter.GetMap(); //initial test
ロード/保存に使用したい ISerializable クラスの主要部分は次のとおりです。
public ImportExporter(RoadManager rm, Bitmap map, Profile p)
{
savedRoadmanager = rm;
savedMap = map;
savedProfile = p;
}
//ISerializable constructor that loads all the needed information
public ImportExporter(SerializationInfo info, StreamingContext context)
{
this.savedRoadmanager = (RoadManager)info.GetValue("savedRoadmanager", savedRoadmanager.GetType());
this.savedMap = (Bitmap)info.GetValue("savedMap", savedMap.GetType());
this.savedProfile = (Profile)info.GetValue("savedProfile", savedProfile.GetType());
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("savedRoadmanager", savedRoadmanager, savedRoadmanager.GetType());
info.AddValue("savedMap", savedMap, savedMap.GetType());
info.AddValue("savedProfile", savedProfile, savedProfile.GetType());
}
ISerializable に慣れるためにいくつかのテストを行いましたが、そのような問題はありませんでした。ソースはそのインターフェースに関連しているかもしれないし、もっと単純なものかもしれないと思います。理想的には、これでエラーが発生しないようにしたいので、指定されたデータを使用してフォームに情報を表示できます。私はこれに何時間も取り組んできたので、頭の中ですべてがごちゃごちゃになり、デバッグが難しくなりました。また、私にとっては新しい素材です。どんな援助でも大歓迎です。