1.背景介绍
-
1.1序列化功能
序列化是将复杂的图形对象、数据结构或对象转换成一种可被存储、传输或分享的格式的过程。这个格式通常是二进制或文本形式,能够轻松地保存在文件中或通过网络发送到其他应用程序。序列化的目的是将数据持久化,使其在不同时间和地点能够被还原为原始对象。
在图形平台开发中,序列化常常用于保存用户创建的图形对象和场景数据。这意味着用户可以在下次打开应用程序时重新加载之前的工作,而无需从头开始。
-
1.2反序列化功能
反序列化是将序列化的数据还原为内存中的对象和数据结构的过程。这个过程是序列化的逆过程,它涉及解码序列化格式并将数据映射回相应的对象和数据结构。
在反序列化过程中,解码器负责解析序列化数据并将其还原为原始数据类型。这可能涉及将字节流转化为数字、字符串、布尔值等基本数据类型,并将其映射回对象的属性。解码器必须确保数据的完整性和一致性,以避免潜在的错误。
-
1.3 序列化的原理
序列化是一项至关重要的技术,它在图形平台开发中发挥着关键作用。序列化的本质是将图形对象和数据结构转化为一种可持久化存储或传输的格式,使得这些数据能够在不同的时间和地点进行加载和还原。为了更好地理解序列化,让我们深入研究其原理。
2.使用场景
- 文件打开
- 文件保存
- 对象拷贝
- 事务机制
3.常用的持久化方案
-
3.1 方案1
在AutoCAD的产品中,如果对象需要持久化,需要实现持久化的类实现如下的接口。
virtual int GetSize() cosnt = 0 | |
virtual bool Serialize(char *pData) = 0 | |
virtual bool Unserialize(char*pData) = 0 | |
virtual Object * Clone() = 0 | |
virtual Object* DeepClone() = 0 |
缺点:容易出错,升级代码维护困难。
-
3.2 方案2
UG/NX,广联达数维等技术方案,利用OM的反射框架,底层统一实现,灵活性不够。
已知情况:
- AutoCAD,AutoCAD Architecture,AutoCAD MEP, 没有OM框架。
- UG/NX、广XX达维设计有自己的OM反射框架。
使用OM优点:对象拷贝,序列化和反序列化,事务支持容易。定义数据对象时,只许通过宏定义对象schema,底层统一实现。
缺点:需要额外的OM框架,增加工作量,问题排查麻烦。
采用AutoCAD无OM模式优点:对象拷贝,序列化和反序列化,数据版本升级容易且灵活,代码的可读性好,问题排查容易。
缺点:新增数据对象,实现自己的拷贝,序列化和反序列化逻辑。
使用OM框架,Redo/Undo能够实现增量备份更容易支持。
4.OM反射方案选择
通过实现类似于Qt中对象属性反射功能,可以参考UG及广XXX达设计实现。
(1)UG方案:实现通过定义对象定义schema文件,类似Qt编译前通过特定程序生成反射代码文件。
反射文件样例:
static ClassAttribute attributeTable[] ={{
&StiffenerParmsClassId, &StiffenerParms::m_distanceToleranceAttId, "m_distanceTolerance", NULL, NULL, NULL, NULL, NULL, NULL,
{0, -1, -1}, 124u, NULL_RTC, offsetof(class UGS::Ship::StiffenerParms, m_distanceTolerance),
0u, 0u, OM_type_double, 0, 0, 0}}
(2)广XX达方案等:通过定义宏来生成反射代码文件。
方案比较
UG方案:代价大,流程复杂,好处是可以生成不同语言的接口文件。
广XX达方案:简单,也能满足要求。
综合考虑,采取类似广XX达方案,简单也能满足需求。
5.OM框架实现
5.1 类Class的Schema设计
成员类型 | 成员名称 | 成员功能 |
ClassId | m_parentClassId | |
ClassId | m_classId | |
Guid | m_assemblyId | 所属模块Guid |
std::vector<PropertySchema> | m_properties | 属性schema列表 |
std::wstring | m_assemblyName | 所属模块名称 |
std::wstring | m_className | |
std::wstring | m_parentClassName | |
int | m_version | |
int | m_index |
5.2 属性Property的schema设计
成员类型 | 成员名称 | 成员功能 |
PropertySchemaType | m_propertySchemaType | |
IntOrFloatType | m_intOrFloatType | |
IntBaseType | m_intBaseType | |
string | m_propertyName | |
string | m_propertyType | |
int | m_offset | |
int | m_propertySize | |
int | m_propertyBehaviourTypes |
6.总结
序列化和反序列化是图形平台开发中的关键技术,它们允许将图形对象和数据结构转化为可持久化存储或传输的格式。不同的序列化实现方案可供选择,包括二进制序列化、XML 和 JSON 序列化,以及自定义序列化。通过基于OM框架的序列化和反序列化方案,可以实现数据的持久性和跨平台传输,为图形平台开发提供更大的灵活性和可扩展性。
君方智能设计平台链接:
ShipMaker船舶协同设计软件介绍-CSDN博客