//---------------------------------------------------------------------------------------------- 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; }