139 static GX_CSTR XML_ELEMENT_STRING_ROOT;
140 static GX_CSTR XML_ELEMENT_STRING_DYNAMIC_ARRAY;
141 static GX_CSTR XML_ELEMENT_STRING_STATIC_ARRAY;
143 static GX_CSTR XML_ATTRIBUTE_STRING_ROOT_NAME;
144 static GX_CSTR XML_ATTRIBUTE_STRING_ROOT_TYPE;
145 static GX_CSTR XML_ATTRIBUTE_STRING_ROOT_INDEX;
146 static GX_CSTR XML_ATTRIBUTE_STRING_OBJECT_COUNT;
147 static GX_CSTR XML_ATTRIBUTE_STRING_ARRAY_NAME;
148 static GX_CSTR XML_ATTRIBUTE_STRING_ARRAY_COUNT;
149 static GX_CSTR XML_ATTRIBUTE_STRING_PROPERTY_NAME;
150 static GX_CSTR XML_ATTRIBUTE_STRING_CLASS_TYPE;
151 static GX_CSTR XML_ATTRIBUTE_STRING_CLASS_INDEX;
152 static GX_CSTR XML_ATTRIBUTE_STRING_CLASS_INSTANCE;
153 static GX_CSTR XML_ATTRIBUTE_STRING_CUSTOM_PROPERTY_TYPE;
154 static GX_CSTR XML_ATTRIBUTE_STRING_CUSTOM_PROPERTY_KIND;
155 static GX_CSTR XML_ATTRIBUTE_STRING_CUSTOM_PROPERTY_COUNT;
156 static GX_CSTR XML_ATTRIBUTE_STRING_CUSTOM_PROPERTY_VALUE;
157 static GX_CSTR XML_ATTRIBUTE_STRING_DATA_VALUE;
159 static constexpr u32 XML_ATTRIBUTE_MAX = 8;
162 enum class XML_ELEMENT_TYPE
173 enum class XML_ATTRIBUTE_TYPE
185 CUSTOM_PROPERTY_NAME,
186 CUSTOM_PROPERTY_KIND,
187 CUSTOM_PROPERTY_COUNT,
188 CUSTOM_PROPERTY_VALUE,
197 class GxBinarySerializer
204 static constexpr u32 VERSION = 110;
222 GxBinarySerializer(
void) {}
226 GxBinarySerializer(
GxStream* pStream) : _pStream(pStream) { GX_MEMSET(&_header, 0,
sizeof(Header)); }
228 ~GxBinarySerializer(
void) {}
232 GxBinarySerializer(
const GxBinarySerializer&);
234 GX_FORCE_INLINE
const GxBinarySerializer& operator=(
const GxBinarySerializer&);
244 b32 read(
void* pDst, u32 size);
246 b32 read(u8& dst) { u32 temporary;
b32 result = read(&temporary,
sizeof(temporary)); dst =
static_cast<u8
>(temporary);
return result; }
248 b32 read(s8& dst) { u32 temporary;
b32 result = read(&temporary,
sizeof(temporary)); dst =
static_cast<s8
>(temporary);
return result; }
250 b32 read(u16& dst) { u32 temporary;
b32 result = read(&temporary,
sizeof(temporary)); dst =
static_cast<u16
>(temporary);
return result; }
252 b32 read(s16& dst) { u32 temporary;
b32 result = read(&temporary,
sizeof(temporary)); dst =
static_cast<s16
>(temporary);
return result; }
254 b32 read(u32& dst) { u32 temporary;
b32 result = read(&temporary,
sizeof(temporary)); dst =
static_cast<u32
>(temporary);
return result; }
256 b32 read(s32& dst) { u32 temporary;
b32 result = read(&temporary,
sizeof(temporary)); dst =
static_cast<s32
>(temporary);
return result; }
258 b32 read(u64& dst) {
return read(&dst,
sizeof(dst)); }
260 b32 read(s64& dst) {
return read(&dst,
sizeof(dst)); }
262 b32 read(u128& dst) {
return read(&dst,
sizeof(dst)); }
264 b32 read(s128& dst) {
return read(&dst,
sizeof(dst)); }
266 b32 read(
b32& dst) { u32 temporary;
b32 result = read(temporary); dst = (temporary) ?
true :
false;
return result; }
268 b32 readHeader(
const GxRtti* pRtti, u32* pObjectCount);
270 b32 write(
const void* pSrc, u32 size);
272 b32 write(
const u8& src) { u32 temporary = src;
return write(&temporary,
sizeof(temporary)); }
274 b32 write(
const s8& src) { s32 temporary = src;
return write(&temporary,
sizeof(temporary)); }
276 b32 write(
const u16& src) { u32 temporary = src;
return write(&temporary,
sizeof(temporary)); }
278 b32 write(
const s16& src) { s32 temporary = src;
return write(&temporary,
sizeof(temporary)); }
280 b32 write(
const u32& src) { u32 temporary = src;
return write(&temporary,
sizeof(temporary)); }
282 b32 write(
const s32& src) { s32 temporary = src;
return write(&temporary,
sizeof(temporary)); }
284 b32 write(
const u64& src) {
return write(&src,
sizeof(src)); }
286 b32 write(
const s64& src) {
return write(&src,
sizeof(src)); }
288 b32 write(
const u128& src) {
return write(&src,
sizeof(src)); }
290 b32 write(
const s128& src) {
return write(&src,
sizeof(src)); }
292 b32 write(
const b32& src) { u32 temporary = src.
_boolean;
return write(temporary); }
294 b32 writeHeader(
const GxRtti* pRtti, u32 objectCount);
298 b32 writeRttiId(
const GxRtti* pRtti =
nullptr);
300 b32 isFileEnd(
void)
const { GX_ASSERT(_pStream,
"_pStream not initialize!!");
return _pStream->
isEnd(); }
302 s32 getRemainSize(
void)
const { GX_ASSERT(_pStream,
"_pStream not initialize!!");
return _pStream->
getRemainSize(); }
335 static constexpr s32 ARRAY_ELEMENT_INDEX_VALUE = -2;
344 GxObjectNode(
void) : _pObject(
nullptr), _pObjectRtti(
nullptr), _pPropertyTable(
nullptr), _pProperty(
nullptr), _pOwner(
nullptr), _pObjectInstance(
nullptr) {}
348 GxObjectNode(
void* pObject,
const GxRtti* pObjectRtti,
GxPropertyTable* pPropertyTable,
GxProperty* pProperty,
void* pOwner, u32 arrayIndex,
b32 isHavingInstance, s32 objectIndex)
350 , _pObjectRtti(pObjectRtti)
351 , _pPropertyTable(pPropertyTable)
352 , _pProperty(pProperty)
354 , _arrayIndex(arrayIndex)
356 , _isHavingInstance(isHavingInstance)
357 , _objectIndex(objectIndex)
358 , _pObjectInstance(
nullptr)
362 b32 operator==(
const GxObjectNode& node)
const;
371 b32 isPointerType(
void)
const;
373 constexpr void setObject(
void* pObject) { _pObject = pObject; }
375 constexpr void* getObject(
void)
const {
return _pObject; }
377 constexpr void setObjectRtti(
const GxRtti* pObjectRtti) { _pObjectRtti = pObjectRtti; }
379 GX_FORCE_INLINE
const GxRtti* getObjectRtti(
void)
const {
return _pObjectRtti; }
381 constexpr GxPropertyTable* getPropertyTable(
void) {
return _pPropertyTable; }
383 constexpr void setProperty(
GxProperty* pProperty) { _pProperty = pProperty; }
385 constexpr GxProperty* getProperty(
void)
const {
return _pProperty; }
387 constexpr void setOwner(
void* pOwner) { _pOwner = pOwner; }
389 constexpr void* getOwner(
void)
const {
return _pOwner; }
391 constexpr u32 getArrayIndex(
void)
const {
return _arrayIndex; }
393 constexpr u32 incrementArrayIndex(
void) {
return ++_arrayIndex; }
395 constexpr void setArrayCount(u32 count) { _arrayCount = count; }
397 constexpr u32 getArrayCount(
void)
const {
return _arrayCount; }
399 constexpr void setObjectIndex(s32 objectIndex) { _objectIndex = objectIndex; }
401 constexpr s32 getObjectIndex(
void)
const {
return _objectIndex; }
403 GX_FORCE_INLINE
b32 isHavingInstance(
void)
const {
return _isHavingInstance; }
405 GX_FORCE_INLINE
void setHavingInstance(
b32 flag) { _isHavingInstance = flag; }
407 constexpr void setObjectInstance(GxObjectNode* pObjectInstance) { _pObjectInstance = pObjectInstance; }
409 constexpr GxObjectNode* getObjectInstance(
void)
const {
return _pObjectInstance; }
411 GX_FORCE_INLINE
b32 isArrayElement(
void)
const {
return (_objectIndex == ARRAY_ELEMENT_INDEX_VALUE); }
420 const GxRtti* _pObjectRtti;
426 b32 _isHavingInstance;
428 GxObjectNode* _pObjectInstance;
436 class GxObjectTree :
public GxTree
444 GX_RTTI_CLASS(GxObjectTree,
GxTree)
473 b32 createObjectList(u32 objectListCount);
476 void setObjectInstancePointer(
void);
487 b32 checkCurrentNodeInstance(
void);
495 void setObjectNodeIndex(
void);
504 constexpr GxTree::GxNode* getCurrentNode(
void) {
return _pCurrent; }
506 constexpr void setCurrentNode(
GxTree::GxNode* pNode) { _pCurrent = pNode; }
508 GX_FORCE_INLINE
void setCurrentNodeToParent(
void) { _pCurrent = _pCurrent->
getParent(); }
510 GX_FORCE_INLINE
void setCurrentNodeToChild(
void) { _pCurrent = _pCurrent->
getChild(); }
512 constexpr u32 getObjectIndexCount(
void)
const {
return _objectIndexCount; }
514 constexpr void setObjectList(
void* pObject, u32 objectIndex) { _ppObjectList[objectIndex] = pObject; }
516 constexpr void* getObjectList(u32 objectIndex) {
return _ppObjectList[objectIndex]; }
525 void** _ppObjectList;
526 u32 _objectListCount;
527 u32 _objectIndexCount;
568 void registerFallbackFunction(GxProperty::PROPERTY_FUNCTION_FROM_STRING pFunction);
575 b32 serializeBinary(GxStream& stream, GxTypedObject* pObject, const GxRtti& rtti, b32 isDifference = false);
597 b32 serializeObjectBinary(GxTypedObject* pObject, GxPropertyTable* pPropertyTable, b32 isDifference = false);
604 void terminateBinary(
void);
610 void terminateXmlParser(
void);
614 void terminateXMLWriter(
void);
620 static void GX_XML_CDECL callbackStartElement(
void* pUserData, GX_CSTR elementName, GX_CSTR* ppAttributes);
622 static void GX_XML_CDECL callbackEndElement(
void* pUserData, GX_CSTR elementName);
625 static b32 isElementType(GX_CSTR elementTag, XML_ELEMENT_TYPE xmlElementType);
627 static b32 isAttributeType(GX_CSTR attributeTag, XML_ATTRIBUTE_TYPE xmlAttributeType);
630 GX_CSTR getRootObjectName(
void)
const;
632 GX_CSTR getStartElementAttribute(GX_CSTR* ppAttributes, XML_ATTRIBUTE_TYPE type, u32 paramIndex = 0);
643 b32 _isCreatePointerObject;
644 GxObjectTree* _pObjectTree;
646 GxBinarySerializer* _pBinarySerializer;
649 GxXmlParser* _pXmlParser;
650 GxXmlWriter* _pXmlWriter;
651 s32 _startElementAttributeIndex[
static_cast<s32
>(XML_ATTRIBUTE_TYPE::MAX)];
652 GxProperty::PROPERTY_FUNCTION_FROM_STRING _pFallbackFunction;