none
C++: Десериализация объекта, содержащего [NonSerialized] элементы RRS feed

  • Вопрос

  • Здравствуйте.

    Намедни попробовал использовать сериализацию объектов. Все получилось без проблем. Проблемы возникли при попытке десериализовать объект, предварительно сериализованый в файл.

    Получается следующая картина:

     

    public ref class A {
    public:
    Int32 i;
    Void assign(A ^ob) {
    i = ob->i}
    A() {i=0;}
    };
    
    [Serializable]
    public ref class B {
    public:
    <.....>
    [NonSerialized]
    A ^a;
    Void assign(B ^ob) {
    <.....>
    a->assign(ob->a);
    }
    B() {a=gcnew A;}
    };
    
    public ref class myFileStream: public FileStream {
    public:
    Void Write(B ^ob);
    Int32 Read(B ^ob);
    myFileStream(	String^ path, 
    			FileMode mode, 
    			FileAccess access
    		 ): FileStream(path,mode,access){};
    };
    
    .....
    
    Int32 myFileStream::Read(B ^ob) {
    BinaryFormatter BF = gcnew BinaryFormatter;
    ob->assign(dynamic_cast<B ^>(BF->Deserialize(this))); // !! вот тут и начинаются проблемы !!
    return 0;
    }
    
     
    

     

    В Int32 myFileStream::Read(B ^ob) проблемы при преобразовании десериализованного объекта в B^.

    Имеется следующая ругань:

    "An unhandled exception of type 'System.NullReferenceException' occurred in System.Windows.Forms.dll

    Additional information: Object reference not set to an instance of an object."

    Источник проблемы мне ясен, но неясно как его обойти. Обрабатывать исключение? Или еще как-то можно?

    Спасибо.

    ps:

    Хочу еще заметить, что если убрать [NonSerialized] с b->a, то десериализация проходит безо всяких проблем.

    19 декабря 2010 г. 15:48

Ответы

  • решение оказалось довольно примитивным.

    в присваивании надо было условный оператор поставить. и все.

    Void assign(B ^ob) {
    <.....>
    if (ob->a) a->assign(ob->a);
    }
    


    • Помечено в качестве ответа Abolmasov Dmitry 21 декабря 2010 г. 19:03
    20 декабря 2010 г. 18:34