NullReferenceException при сериализации объекта
От: _dionnis  
Дата: 26.01.11 10:58
Оценка:
Добрый день всем!
Столкнулся с непонятной проблемой:
При сериализации объекта у меня возникает исключение класса NullReferenceException:


Stream s = new MemoryStream();
            BinaryFormatter f = new BinaryFormatter();

            f.Serialize(s, myObject);
            s.Flush();
            s.Position = 0;

            MyObject myDeserializedObject = f.Deserialize(s) as MyObject;



Исключение это выскакивает на инструкции f.Serialize(s, myObject);

Ниже StackTrace:


at Wintellect.PowerCollections.Hash`1.System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
   at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
   at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
   at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)
   at BalanceLoad.MainForm.customizeToolStripMenuItem_Click(Object sender, EventArgs e) in D:\Stochastic\VS2010\Core\BalanceLoad\MainForm.cs:line 1140
   at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ToolStrip.WndProc(Message& m)
   at System.Windows.Forms.ToolStripDropDown.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 BalanceLoad.Program.Main() in D:\Stochastic\VS2010\Core\BalanceLoad\Program.cs:line 17
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()



Уже наверное всё перепробовал, но природа возникновения ошибки так и осталась для меня загадкой...
Пример к сожаление не могу выложить, так как myObject большой и сложный иерархический объект, который создаётся на основании данных из многих таблиц баз данных.
Воспроизвести самостоятельно такой эксепшен у меня не получилось.
Поискав в инете ответ на свой вопрос нашёл похожую тему, но на неё так никто и не ответил.

Заранее благодарен за любые советы/ссылки/рекомендации!
Спасибо!
Re: NullReferenceException при сериализации объекта
От: _FRED_ Черногория
Дата: 26.01.11 11:16
Оценка: +1
Здравствуйте, _dionnis, Вы писали:

_>Столкнулся с непонятной проблемой:

_>При сериализации объекта у меня возникает исключение класса NullReferenceException:

_>Ниже StackTrace:

_>at Wintellect.PowerCollections.Hash`1.System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)


_>Уже наверное всё перепробовал, но природа возникновения ошибки так и осталась для меня загадкой...


Ну так за чем же дело встало? эта библиотека с открытыми исходниками. Собираете сами, подкладываете вместе с символами (.pdb) своему приложению, запускаете. Отладчик сам и покажет вам строчку, в которой возникло исключение.
Help will always be given at Hogwarts to those who ask for it.
Re: NullReferenceException при сериализации объекта
От: Kalina9001  
Дата: 26.01.11 11:19
Оценка:
Здравствуйте, _dionnis, Вы писали:



_>StackTrace:



_>[c#]

_>at Wintellect.PowerCollections.Hash`1.System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
_> at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
_> at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
_> at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
_> at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
_> at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)
_> at BalanceLoad.MainForm.customizeToolStripMenuItem_Click(Object sender, EventArgs e) in D:\Stochastic\VS2010\Core\BalanceLoad\MainForm.cs:line 1140

Дебаж Wintellect.PowerCollections.Hash`1.System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
... << RSDN@Home 1.2.0 alpha 4 rev. 1478>>
Re[2]: NullReferenceException при сериализации объекта
От: _FRED_ Черногория
Дата: 26.01.11 11:20
Оценка:
Здравствуйте, _FRED_, Вы писали:

_>>Уже наверное всё перепробовал, но природа возникновения ошибки так и осталась для меня загадкой...


Очень легко выгугливается: http://powercollections.codeplex.com/workitem/1749
Help will always be given at Hogwarts to those who ask for it.
Re[2]: NullReferenceException при сериализации объекта
От: _dionnis  
Дата: 26.01.11 12:32
Оценка:
Здравствуйте, _FRED_, Вы писали:


_FR>Ну так за чем же дело встало? эта библиотека с открытыми исходниками. Собираете сами, подкладываете вместе с символами (.pdb) своему приложению, запускаете. Отладчик сам и покажет вам строчку, в которой возникло исключение.


Это понятно, так и сделал.
Возникает на строчке


foreach (Slot slot in table)
    if (!slot.Empty)
        items[i++] = slot.item;


метода void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context),

потомучто table == null

Не пойму почему так происходит, т.е. почему отдельно объект типа info.ObjectType сериализуется, а когда он в составе объекта myObject, то происходит вот такая вот ошибка.
Re[2]: NullReferenceException при сериализации объекта
От: _dionnis  
Дата: 26.01.11 12:34
Оценка:
Здравствуйте, Kalina9001, Вы писали:


K>Дебаж Wintellect.PowerCollections.Hash`1.System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)


Собственно так и делаю
Re[3]: NullReferenceException при сериализации объекта
От: _dionnis  
Дата: 26.01.11 12:50
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Очень легко выгугливается: http://powercollections.codeplex.com/workitem/1749


Да, похожая проблема, спасибо за ссылочку , но и там нет ответа на вопрос...
Re[3]: NullReferenceException при сериализации объекта
От: _FRED_ Черногория
Дата: 26.01.11 12:58
Оценка:
Здравствуйте, _dionnis, Вы писали:

_FR>>Ну так за чем же дело встало? эта библиотека с открытыми исходниками. Собираете сами, подкладываете вместе с символами (.pdb) своему приложению, запускаете. Отладчик сам и покажет вам строчку, в которой возникло исключение.


_>Это понятно, так и сделал.


Так поотжаживайте, посмотрите, почему вдруг "table == null". Это очевидный баг. На первый взгляд кажется достаточным добавить проверку на null перед
_>foreach (Slot slot in table)


Если без изменения PowerCollections — просто проверяйте перед сериализацией вашего объекта, что он не пустой и если пустой — сохраняйте null. при восстановлении — обратный процесс.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.