//----------------------------------------------------------------------------------------------
int ObjectSerializer::DeserializeUserDefinedType(char* p_fieldAddress, TypeNode* p_type, bool p_isPtr, fstream& p_eye)
{
    int     size = 0;
    UserObject* object = NULL;
    bool    isNull = false;

    if(p_isPtr)
    {
        unsigned* addr32;
        p_eye.read(reinterpret_cast<char*>(&isNull), sizeof(bool));
        addr32 = reinterpret_cast<unsigned*>(p_fieldAddress);

        if(!isNull)
        {
            string  typeName;
            char    buffer[MaxTypeNameLength + 1];

            p_eye.read(buffer, MaxTypeNameLength + 1);
            typeName = buffer;
            object = static_cast<UserObject*>(g_ObjectFactory.GetObject(typeName)->Prototype());

            PerformLateBinding(object, p_type);

            object->InitializeAddresses();

            Iterator* addresses = object->GetIterator();
            unsigned* addr32;
            for(int memberIdx = 0; addresses->MoveNext(); ++memberIdx)
            {
                _ASSERTE(memberIdx < p_type->Children.size());
                addr32 = reinterpret_cast<unsigned*>(addresses->Current());
                DeserializeType(reinterpret_cast<char*>(*addr32), p_type->Children[memberIdx].Ptr32, p_eye);
            }
        }

        *addr32 = reinterpret_cast<unsigned>(object);
        size = sizeof(unsigned);
    }
    else
    {
        object = reinterpret_cast<UserObject*>(p_fieldAddress);
        object->InitializeAddresses();

        Iterator* addresses = object->GetIterator();
        unsigned* addr32;
        for(int memberIdx = 0; addresses->MoveNext(); ++memberIdx)
        {
            _ASSERTE(memberIdx < p_type->Children.size());
            addr32 = reinterpret_cast<unsigned*>(addresses->Current());
            DeserializeType(reinterpret_cast<char*>(*addr32), p_type->Children[memberIdx].Ptr32, p_eye);
        }

        size = object->TypeSize();
    }

    return size;
}
//----------------------------------------------------------------------------------------------
int ObjectSerializer::DeserializePair(char* p_fieldAddress, TypeNode* p_type, fstream& p_eye)
{
    // Pointer to pair is not supported
    _ASSERTE(p_type->Indirection == false);

    UserObject* object = reinterpret_cast<UserObject*>(p_fieldAddress);
    object->InitializeAddresses();

    Iterator* addresses = object->GetIterator();
    unsigned* addr32;
    for(int memberIdx = 0; addresses->MoveNext(); ++memberIdx)
    {
        addr32 = reinterpret_cast<unsigned*>(addresses->Current());
        DeserializeType(reinterpret_cast<char*>(*addr32), p_type->TemplateArguments[memberIdx], p_eye);
    }

    return object->TypeSize();
}
//----------------------------------------------------------------------------------------------
int ObjectSerializer::SerializeUserDefinedType(char* p_fieldAddress, TypeNode* p_type, bool p_isPtr, fstream& p_pen)
{
    int     size = 0;
    UserObject* object = NULL;
    bool    isNull = false;
    if(p_isPtr)
    {
        int         length = 0;
        string      typeName;
        char        buffer[MaxTypeNameLength + 1];
        unsigned*   addr32 = reinterpret_cast<unsigned*>(p_fieldAddress);

        isNull = (NULL == *addr32);
        p_pen.write(reinterpret_cast<char*>(&isNull), sizeof(bool));

        if(!isNull)
        {
            object = reinterpret_cast<UserObject*>(*addr32);

            typeName = g_ObjectFactory.FromCName(object->CName());

            PerformLateBinding(object, p_type);

            length = typeName.size();
            _ASSERTE(length <= MaxTypeNameLength);
            strcpy(buffer, typeName.c_str());
            buffer[length] = 0;
            p_pen.write(buffer, MaxTypeNameLength + 1);

            object->InitializeAddresses();

            Iterator* addresses = object->GetIterator();
            unsigned* addr32;
            for(int memberIdx = 0; addresses->MoveNext(); ++memberIdx)
            {
                _ASSERTE(memberIdx < p_type->Children.size());
                addr32 = reinterpret_cast<unsigned*>(addresses->Current());
                SerializeType(reinterpret_cast<char*>(*addr32), p_type->Children[memberIdx].Ptr32, p_pen);
            }
        }
        size = sizeof(unsigned);
    }
    else
    {
        object = reinterpret_cast<UserObject*>(p_fieldAddress);
        object->InitializeAddresses();

        Iterator* addresses = object->GetIterator();
        unsigned* addr32;
        for(int memberIdx = 0; addresses->MoveNext(); ++memberIdx)
        {
            _ASSERTE(memberIdx < p_type->Children.size());
            addr32 = reinterpret_cast<unsigned*>(addresses->Current());
            SerializeType(reinterpret_cast<char*>(*addr32), p_type->Children[memberIdx].Ptr32, p_pen);
        }

        size = object->TypeSize();
    }

    return size;
}