📄 objistr.cpp
字号:
m_PathReadObjectHooks.SetHook(path,hook); WatchPathHooks();}void CObjectIStream::SetPathSkipObjectHook(const string& path, CSkipObjectHook* hook){ m_PathSkipObjectHooks.SetHook(path,hook); WatchPathHooks();}void CObjectIStream::SetPathReadMemberHook(const string& path, CReadClassMemberHook* hook){ m_PathReadMemberHooks.SetHook(path,hook); WatchPathHooks();}void CObjectIStream::SetPathSkipMemberHook(const string& path, CSkipClassMemberHook* hook){ m_PathSkipMemberHooks.SetHook(path,hook); WatchPathHooks();}void CObjectIStream::SetPathReadVariantHook(const string& path, CReadChoiceVariantHook* hook){ m_PathReadVariantHooks.SetHook(path,hook); WatchPathHooks();}void CObjectIStream::SetPathSkipVariantHook(const string& path, CSkipChoiceVariantHook* hook){ m_PathSkipVariantHooks.SetHook(path,hook); WatchPathHooks();}string CObjectIStream::GetStackTrace(void) const{ return GetStackTraceASN();}size_t CObjectIStream::GetStreamOffset(void) const{ return m_Input.GetStreamOffset();}void CObjectIStream::SetStreamOffset(size_t pos){ m_Input.SetStreamOffset(pos);}string CObjectIStream::GetPosition(void) const{ return "byte "+NStr::UIntToString(GetStreamOffset());}void CObjectIStream::ThrowError1(const char* file, int line, TFailFlags fail, const char* message){ ThrowError1(file,line,fail,string(message));}void CObjectIStream::ThrowError1(const char* file, int line, TFailFlags fail, const string& message){ CSerialException::EErrCode err; SetFailFlags(fail, message.c_str()); switch(fail) { case fNoError: CNcbiDiag(file, line, eDiag_Trace) << message; return; case fEOF: err = CSerialException::eEOF; break; default: case fReadError: err = CSerialException::eIoError; break; case fFormatError: err = CSerialException::eFormatError; break; case fOverflow: err = CSerialException::eOverflow; break; case fInvalidData: err = CSerialException::eInvalidData; break; case fIllegalCall: err = CSerialException::eIllegalCall; break; case fFail: err = CSerialException::eFail; break; case fNotOpen: err = CSerialException::eNotOpen; break; case fMissingValue: err = CSerialException::eMissingValue; break; } throw CSerialException(file,line,0,err,GetPosition()+": "+message);}static inlineTTypeInfo MapType(const string& name){ return CClassTypeInfoBase::GetClassInfoByName(name);}void CObjectIStream::RegisterObject(TTypeInfo typeInfo){ if ( m_Objects ) m_Objects->RegisterObject(typeInfo);}void CObjectIStream::RegisterObject(TObjectPtr objectPtr, TTypeInfo typeInfo){ if ( m_Objects ) m_Objects->RegisterObject(objectPtr, typeInfo);}const CReadObjectInfo&CObjectIStream::GetRegisteredObject(CReadObjectInfo::TObjectIndex index){ if ( !m_Objects ) { ThrowError(fFormatError,"invalid object index: NO_COLLECT defined"); } return m_Objects->GetRegisteredObject(index);}// root readervoid CObjectIStream::SkipFileHeader(TTypeInfo typeInfo){ BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo); string name = ReadFileHeader(); if ( !name.empty() && name != typeInfo->GetName() ) { ThrowError(fFormatError, "incompatible type "+name+"<>"+typeInfo->GetName()); } END_OBJECT_FRAME();}void CObjectIStream::EndOfRead(void){ if ( m_Objects ) m_Objects->Clear();}void CObjectIStream::Read(const CObjectInfo& object, ENoFileHeader){ // root object BEGIN_OBJECT_FRAME2(eFrameNamed, object.GetTypeInfo()); ReadObject(object); EndOfRead(); END_OBJECT_FRAME();}void CObjectIStream::Read(const CObjectInfo& object){ // root object SkipFileHeader(object.GetTypeInfo()); Read(object, eNoFileHeader);}void CObjectIStream::Read(TObjectPtr object, TTypeInfo typeInfo, ENoFileHeader){ // root object BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo); ReadObject(object, typeInfo); EndOfRead(); END_OBJECT_FRAME();}void CObjectIStream::Read(TObjectPtr object, TTypeInfo typeInfo){ // root object SkipFileHeader(typeInfo); Read(object, typeInfo, eNoFileHeader);}CObjectInfo CObjectIStream::Read(TTypeInfo typeInfo){ // root object SkipFileHeader(typeInfo); CObjectInfo info(typeInfo->Create(), typeInfo); Read(info, eNoFileHeader); return info;}CObjectInfo CObjectIStream::Read(const CObjectTypeInfo& type){ return Read(type.GetTypeInfo());}void CObjectIStream::Skip(TTypeInfo typeInfo, ENoFileHeader){ BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo); SkipObject(typeInfo); EndOfRead(); END_OBJECT_FRAME();}void CObjectIStream::Skip(TTypeInfo typeInfo){ SkipFileHeader(typeInfo); Skip(typeInfo, eNoFileHeader);}void CObjectIStream::Skip(const CObjectTypeInfo& type){ Skip(type.GetTypeInfo());}void CObjectIStream::StartDelayBuffer(void){ m_Input.StartSubSource();}CRef<CByteSource> CObjectIStream::EndDelayBuffer(void){ return m_Input.EndSubSource();}void CObjectIStream::EndDelayBuffer(CDelayBuffer& buffer, const CItemInfo* itemInfo, TObjectPtr objectPtr){ CRef<CByteSource> src = EndDelayBuffer(); buffer.SetData(itemInfo, objectPtr, GetDataFormat(), *src);}void CObjectIStream::ExpectedMember(const CMemberInfo* memberInfo){ if (GetVerifyData() == eSerialVerifyData_Yes) { ThrowError(fFormatError, "member "+memberInfo->GetId().ToString()+" expected"); } else { ERR_POST("member "+memberInfo->GetId().ToString()+" is missing"); }}void CObjectIStream::DuplicatedMember(const CMemberInfo* memberInfo){ ThrowError(fFormatError, "duplicated member: "+memberInfo->GetId().ToString());}void CObjectIStream::ReadSeparateObject(const CObjectInfo& object){ if ( m_Objects ) { size_t firstObject = m_Objects->GetObjectCount(); ReadObject(object); size_t lastObject = m_Objects->GetObjectCount(); m_Objects->ForgetObjects(firstObject, lastObject); } else { ReadObject(object); }}void CObjectIStream::ReadExternalObject(TObjectPtr objectPtr, TTypeInfo typeInfo){ _TRACE("CObjectIStream::Read("<<NStr::PtrToString(objectPtr)<<", "<< typeInfo->GetName()<<")"); RegisterObject(objectPtr, typeInfo); ReadObject(objectPtr, typeInfo);}CObjectInfo CObjectIStream::ReadObject(void){ TTypeInfo typeInfo = MapType(ReadFileHeader()); TObjectPtr objectPtr; BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo); objectPtr = typeInfo->Create(); CRef<CObject> ref; if ( typeInfo->IsCObject() ) ref.Reset(static_cast<CObject*>(objectPtr)); RegisterObject(objectPtr, typeInfo); ReadObject(objectPtr, typeInfo); if ( typeInfo->IsCObject() ) ref.Release(); END_OBJECT_FRAME(); return make_pair(objectPtr, typeInfo);}void CObjectIStream::ReadObject(const CObjectInfo& object){ ReadObject(object.GetObjectPtr(), object.GetTypeInfo());}void CObjectIStream::SkipObject(const CObjectTypeInfo& objectType){ SkipObject(objectType.GetTypeInfo());}void CObjectIStream::ReadClassMember(const CObjectInfo::CMemberIterator& member){ const CMemberInfo* memberInfo = member.GetMemberInfo(); TObjectPtr classPtr = member.GetClassObject().GetObjectPtr(); ReadObject(memberInfo->GetMemberPtr(classPtr), memberInfo->GetTypeInfo());}void CObjectIStream::ReadChoiceVariant(const CObjectInfoCV& object){ const CVariantInfo* variantInfo = object.GetVariantInfo(); TObjectPtr choicePtr = object.GetChoiceObject().GetObjectPtr(); variantInfo->DefaultReadVariant(*this, choicePtr);}string CObjectIStream::ReadFileHeader(void){ return NcbiEmptyString;}string CObjectIStream::PeekNextTypeName(void){ return NcbiEmptyString;}pair<TObjectPtr, TTypeInfo> CObjectIStream::ReadPointer(TTypeInfo declaredType){ _TRACE("CObjectIStream::ReadPointer("<<declaredType->GetName()<<")"); TObjectPtr objectPtr; TTypeInfo objectType; switch ( ReadPointerType() ) { case eNullPointer: _TRACE("CObjectIStream::ReadPointer: null"); return pair<TObjectPtr, TTypeInfo>(0, declaredType); case eObjectPointer: { _TRACE("CObjectIStream::ReadPointer: @..."); TObjectIndex index = ReadObjectPointer(); _TRACE("CObjectIStream::ReadPointer: @" << index); const CReadObjectInfo& info = GetRegisteredObject(index); objectType = info.GetTypeInfo(); objectPtr = info.GetObjectPtr(); if ( !objectPtr ) { ThrowError(fFormatError, "invalid reference to skipped object: object ptr is NULL"); } break; } case eThisPointer: { _TRACE("CObjectIStream::ReadPointer: new"); objectPtr = declaredType->Create(); CRef<CObject> ref; if ( declaredType->IsCObject() ) ref.Reset(static_cast<CObject*>(objectPtr)); RegisterObject(objectPtr, declaredType); ReadObject(objectPtr, declaredType); if ( declaredType->IsCObject() ) ref.Release(); return make_pair(objectPtr, declaredType); } case eOtherPointer: { _TRACE("CObjectIStream::ReadPointer: new..."); string className = ReadOtherPointer(); _TRACE("CObjectIStream::ReadPointer: new " << className); objectType = MapType(className); BEGIN_OBJECT_FRAME2(eFrameNamed, objectType); objectPtr = objectType->Create(); CRef<CObject> ref; if ( declaredType->IsCObject() ) ref.Reset(static_cast<CObject*>(objectPtr)); RegisterObject(objectPtr, objectType); ReadObject(objectPtr, objectType); if ( declaredType->IsCObject() ) ref.Release(); END_OBJECT_FRAME(); ReadOtherPointerEnd(); break; } default: ThrowError(fFormatError,"illegal pointer type"); objectPtr = 0; objectType = 0; break; } while ( objectType != declaredType ) { // try to check parent class pointer if ( objectType->GetTypeFamily() != eTypeFamilyClass ) { ThrowError(fFormatError,"incompatible member type"); } const CClassTypeInfo* parentClass = CTypeConverter<CClassTypeInfo>::SafeCast(objectType)->GetParentClassInfo(); if ( parentClass ) { objectType = parentClass; } else { ThrowError(fFormatError,"incompatible member type"); } } return make_pair(objectPtr, objectType);}void CObjectIStream::ReadOtherPointerEnd(void){}void CObjectIStream::SkipExternalObject(TTypeInfo typeInfo){ _TRACE("CObjectIStream::SkipExternalObject("<<typeInfo->GetName()<<")"); RegisterObject(typeInfo); SkipObject(typeInfo);}void CObjectIStream::SkipPointer(TTypeInfo declaredType){ _TRACE("CObjectIStream::SkipPointer("<<declaredType->GetName()<<")"); switch ( ReadPointerType() ) { case eNullPointer: _TRACE("CObjectIStream::SkipPointer: null"); return; case eObjectPointer: { _TRACE("CObjectIStream::SkipPointer: @..."); TObjectIndex index = ReadObjectPointer(); _TRACE("CObjectIStream::SkipPointer: @" << index); GetRegisteredObject(index); break; } case eThisPointer: { _TRACE("CObjectIStream::ReadPointer: new"); RegisterObject(declaredType); SkipObject(declaredType); break; } case eOtherPointer: { _TRACE("CObjectIStream::ReadPointer: new..."); string className = ReadOtherPointer(); _TRACE("CObjectIStream::ReadPointer: new " << className); TTypeInfo typeInfo = MapType(className); BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo); RegisterObject(typeInfo); SkipObject(typeInfo); END_OBJECT_FRAME(); ReadOtherPointerEnd(); break; } default: ThrowError(fFormatError,"illegal pointer type"); }}void CObjectIStream::BeginNamedType(TTypeInfo /*namedTypeInfo*/){}void CObjectIStream::EndNamedType(void){}void CObjectIStream::ReadNamedType(TTypeInfo#ifndef VIRTUAL_MID_LEVEL_IO namedTypeInfo#endif , TTypeInfo typeInfo, TObjectPtr object){#ifndef VIRTUAL_MID_LEVEL_IO BEGIN_OBJECT_FRAME2(eFrameNamed, namedTypeInfo); BeginNamedType(namedTypeInfo);#endif ReadObject(object, typeInfo);#ifndef VIRTUAL_MID_LEVEL_IO EndNamedType(); END_OBJECT_FRAME();#endif}void CObjectIStream::SkipNamedType(TTypeInfo namedTypeInfo, TTypeInfo typeInfo){ BEGIN_OBJECT_FRAME2(eFrameNamed, namedTypeInfo); BeginNamedType(namedTypeInfo); SkipObject(typeInfo); EndNamedType(); END_OBJECT_FRAME();}void CObjectIStream::EndContainerElement(void){}void CObjectIStream::ReadContainer(const CContainerTypeInfo* containerType, TObjectPtr containerPtr){ BEGIN_OBJECT_FRAME2(eFrameArray, containerType); BeginContainer(containerType); TTypeInfo elementType = containerType->GetElementType(); BEGIN_OBJECT_FRAME2(eFrameArrayElement, elementType);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -