ãããŠãç§ãæ§ç¯ãããã¢ãŒããã¯ãã£ãã©ãã»ã©èªãã«æã£ãŠããŠããèªããªããã°ãªããŸãã-å®è£ ã¯ççŽã«èšã£ãŠãç©è°ãéžããŠããŸãã
ããããã¹ãŠãå€§èŠæš¡ãªåŠçããããããŸããããã®çµæã«ã€ããŠã¯ããã®èšäºã§èª¬æããŸãã詳现ã«ã€ããŠã¯-ã«ããã®äžã§ïŒ
QSerializerãæ»äº¡ããŸãã
QSerializerã«ã¯æ¬ ç¹ãããããã®è§£æ±ºçã¯ããã«å€§ããªæ¬ ç¹ã«ãªãããšããããããŸããããã®ããã€ããæ¬¡ã«ç€ºããŸãã
- éåžžã«é«äŸ¡ã§ãïŒã·ãªã¢ã«åãããããã£ããŒããŒãããŒãã«ä¿æãããããŒããŒã®å¯¿åœãå¶åŸ¡ãããªã©ïŒ
- QObjectããŒã¹ã®ã¯ã©ã¹ã®ã¿ã䜿çšãã
- ãã¹ãããããè€éãªããªããžã§ã¯ããšãã®ã³ã¬ã¯ã·ã§ã³ãQObjectããŒã¹ã§ããå¿ èŠããããŸã
- ãã·ãªã¢ã©ã€ãºäžã«ã³ã¬ã¯ã·ã§ã³ãè£è¶³ã§ããªã
- çè«çã«ã¯ç¡éã®å ¥ãåã®ã¿
- QObjectããã®ã³ããŒãçŠæ¢ãããŠãããããéèŠãªã¿ã€ãã®ãè€éãªããªããžã§ã¯ããåŠçã§ããªã
- Qtã¡ã¿ãªããžã§ã¯ãã·ã¹ãã ã§ã®ã¿ã€ãã®å¿ é ç»é²ã®å¿ èŠæ§
- ãã©ãããã©ãŒã éã®ãªã³ã¯ãç§»æ€æ§ã®åé¡ãªã©ãäžè¬çãªãã©ã€ãã©ãªãã®åé¡
ç¹ã«ãQSerializeråå空éã§ã¡ãœããã®å·šå€§ãªãã€ã³ãã£ã³ã°ã䜿çšããå¿ èŠããããšãã«ããä»ããã§ãä»»æã®ãªããžã§ã¯ããã·ãªã¢ã«åã§ããããã«ãããã£ãã®ã§ãã
é·çãããQSerializerïŒ
QSerializerã¯å®å šã§ã¯ãããŸããã§ããããŠãŒã¶ãŒãQObjectã«äŸåãããå€ã®åãäœã³ã¹ãã§æäœã§ãããœãªã¥ãŒã·ã§ã³ãèãåºãå¿ èŠããããŸããã
ã§ã³ã¡ã³ããžåã®èšäºããŠãŒã¶ãŒmicrolaQ_GADGETã®äœ¿çšã«ã€ããŠèããããšãã§ããããšã«æ°ã¥ããŸããã
å©ç¹Q_GADGETïŒ
- ã³ããŒã«å¶éã¯ãããŸãã
- ããããã£ã«ã¢ã¯ã»ã¹ããããã®QMetaObjectã®éçã€ã³ã¹ã¿ã³ã¹ããããŸã
Q_GADGETã« äŸåããŠã宣èšãããã¯ã©ã¹ãã£ãŒã«ãã«åºã¥ããŠJSONãšXMLãäœæããæ¹æ³ãžã®ã¢ãããŒããåèããå¿ èŠããããŸããããé«ã³ã¹ããã®åé¡ã¯ãäž»ã«æ¬¡ã®çç±ã§æããã«ãªããŸããã
- 倧容éã®ã¹ãã¬ãŒãžã¯ã©ã¹ãµã€ãºïŒå°ãªããšã40ãã€ãïŒ
- åããããã£ã®æ°ããä¿è·è ãšã³ãã£ãã£ã«ããŒããå²ãåœãŠããããã®TTLãå¶åŸ¡ãã
ã³ã¹ããåæžããããã«ã次ã®èŠä»¶ãçå®ããŸããã
ã¯ã©ã¹ã®ãã¹ãŠã®ããããã£ã®ã·ãªã¢ã«å/éã·ãªã¢ã«åã®ããã®ã¯ã€ã€ãŒã¡ãœããã®åã·ãªã¢ã«åå¯èœãªãªããžã§ã¯ãå ã®ååšãããã³ãã®ããããã£ã«å²ãåœãŠããã圢åŒã䜿çšããŠåããããã£ã®å€ãèªã¿æžãããããã®ã¡ãœããã®ååš
ãã¯ã
èªåã·ãªã¢ã«åãè€éã«ããC ++ã®åŒ·åãªåæå®ãåé¿ããããšã¯å®¹æã§ã¯ãªãã以åã®çµéšã¯ããã瀺ããŠããŸããäžæ¹ããã¯ãã䜿çšãããšãã¡ãœãããšããããã£ã®ã³ãŒãçæãå®è¡ã§ããããããã¯ãã¯ãã®ãããªåé¡ã解決ããããã®åªãããã«ããšããŠåœ¹ç«ã¡ãŸãïŒQtã¡ã¿ãªããžã§ã¯ãã·ã¹ãã å šäœã®ã»ãšãã©ã¯ãã¯ãäžã«æ§ç¯ãããŸãïŒã
ã¯ãããã¯ãã¯æãçŽç²ãªåœ¢ã§æªã§ããããšããããããŸã-ãããããããã°ããããšã¯ã»ãšãã©äžå¯èœã§ããã³ãŒããçæãããã¯ããæžãããšãšãäžåžã®ãããšã«ã¯ãªã¹ã¿ã«ã·ã¥ãŒãºã眮ãããšãæ¯èŒããããšã¯ã§ããŸãããé£ãããšããããšã¯äžå¯èœãšããæå³ã§ã¯ãããŸããã
ãã¯ãã«ã€ããŠã®åæ çãªéžè±
â , , «» (). .
QSerializerã¯çŸåšãã¯ã©ã¹ãã·ãªã¢ã«åå¯èœãšããŠå®£èšãã2ã€ã®æ¹æ³ãæäŸããŠããŸããQSerializerã¯ã©ã¹ããç¶æ¿ããããQS_CLASSã³ãŒãçæãã¯ãã䜿çšããŸãã
ãŸããã¯ã©ã¹ã®æ¬äœã§Q_GADGETãã¯ããå®çŸ©ããå¿ èŠããããŸããããã«ãããstaticMetaObjectã«ã¢ã¯ã»ã¹ã§ããããã«ãªãããã¯ãã«ãã£ãŠçæãããããããã£ãä¿åãããŸãã
QSerializerããç¶æ¿ãããšãè€æ°ã®ã·ãªã¢ã«åå¯èœãªãªããžã§ã¯ãã1ã€ã®ã¿ã€ãã«ãã£ã¹ããããããããŸãšããŠã·ãªã¢ã«åã§ããŸãã
QSerializerã¯ã©ã¹ã«ã¯ããªããžã§ã¯ãã®ããããã£ãè§£æã§ãã4ã€ã®ãšã¯ã¹ãããŒã©ãŒã¡ãœãããšãQMetaObjectã®ã€ã³ã¹ã¿ã³ã¹ãååŸããããã®1ã€ã®ä»®æ³ã¡ãœãããå«ãŸããŠããŸãã
QJsonValue toJson() const
void fromJson(const QJsonValue &)
QDomNode toXml() const
void fromXml(const QDomNode &)
virtual const QMetaObject * metaObject() const
Q_GADGETã«ã¯ãQ_OBJECTãæäŸãããã¹ãŠã®ã¡ã¿ãªããžã§ã¯ããã€ã³ãã£ã³ã°ãå«ãŸããŠããããã§ã¯ãããŸããã
QSerializerå ã§ã¯ãstaticMetaObjectã€ã³ã¹ã¿ã³ã¹ã¯QSerializerã¯ã©ã¹ã衚ããŸãããããããæŽŸçããããšã¯ãããŸããããããã£ãŠãQSerializerããŒã¹ã®ã¯ã©ã¹ãäœæãããšãã¯ãmetaObjectã¡ãœããããªãŒããŒã©ã€ãããå¿ èŠããããŸããQS_SERIALIZERãã¯ããã¯ã©ã¹æ¬äœã«è¿œå ãããšãmetaObjectã¡ãœããããªãŒããŒã©ã€ããããŸãã
ãŸããåãªããžã§ã¯ãã«QMetaObjectã€ã³ã¹ã¿ã³ã¹ãæ ŒçŽãã代ããã«staticMetaObjectã䜿çšãããšãã¯ã©ã¹ãµã€ãºãã40ãã€ãç¯çŽã§ããŸãã
äœããã®çç±ã§ç¶æ¿ããããªãå Žåã¯ãã·ãªã¢ã«åãããã¯ã©ã¹ã®æ¬äœã§QS_CLASSãã¯ããå®çŸ©ã§ããŸãããQSerializerããç¶æ¿ãã代ããã«ãå¿ èŠãªãã¹ãŠã®ã¡ãœãããçæããŸãã
ãã£ãŒã«ãã®å®£èš
ãããšã¯å¥ã«ãJSONãšXMLã«ã¯4çš®é¡ã®ã·ãªã¢ã«åå¯èœãªããŒã¿ãããããããã®åœ¢åŒãžã®ã·ãªã¢ã«åã¯å®äºããŸããããã®è¡šã¯ã以äžã説æããæ¹æ³ãšããŠãããŒã¿ã®ã¿ã€ããšå¯Ÿå¿ãããã¯ãã瀺ããŠããŸãã
| ããŒã¿ã»ã¿ã€ã | 説æ | 倧ãã |
|---|---|---|
| ãã£ãŒã«ã | ããªããã£ãã¿ã€ãã®éåžžã®ãã£ãŒã«ãïŒããŸããŸãªçªå·ãæååããã©ã°ïŒ | QS_FIELD |
| ã³ã¬ã¯ã·ã§ã³ | ããªããã£ãããŒã¿ã¿ã€ãã®å€ã®ã»ãã | QS_COLLECTION |
| ãªããžã§ã¯ã | ãã£ãŒã«ãã®è€éãªæ§é ãŸãã¯ä»ã®è€éãªæ§é | QS_OBJECT |
| ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ | åãã¿ã€ãã®è€éãªããŒã¿æ§é ã®ã»ãã | QS_COLLECTION_OBJECTS |
ãããã®ãã¯ããçæããã³ãŒãã¯èšè¿°ãšåŒã°ãããããçæãããã¯ãã¯èšè¿°ãšåŒã°ãããšæ³å®ããŸãã
説æãçæããããã®å¯äžã®ååããããŸã-ç¹å®ã®ãã£ãŒã«ãã«å¯ŸããŠãJSONããã³XMLããããã£ãçæããå€ãèªã¿æžãããããã®ã¡ãœãããå®çŸ©ããŸãã
ããªããã£ãããŒã¿ã¿ã€ããã£ãŒã«ãã®äŸã䜿çšããŠãJSONèšè¿°ã®çæãåæããŠã¿ãŸãããã
/* Create JSON property and methods for primitive type field*/
#define QS_JSON_FIELD(type, name)
Q_PROPERTY(QJsonValue name READ get_json_##name WRITE set_json_##name)
private:
QJsonValue get_json_##name() const {
QJsonValue val = QJsonValue::fromVariant(QVariant(name));
return val;
}
void set_json_##name(const QJsonValue & varname){
name = varname.toVariant().value<type>();
}
...
int digit;
QS_JSON_FIELD(int, digit)
intæ¡ãã£ãŒã«ãã®å ŽåãQJsonValueã¿ã€ãã®ããããã£æ¡ãçæããããã©ã€ããŒãæžã蟌ã¿ããã³èªã¿åãã¡ãœããïŒget_json_digitããã³set_json_digitãå®çŸ©ãããŸãïŒãå®çŸ©ãããJSONã䜿çšããŠæ¡ãã£ãŒã«ããã·ãªã¢ã«å/éã·ãªã¢ã«åããããã®ã³ã³ãã¯ã¿ãŒã«ãªããŸãã
ããã¯ã©ã®ããã«èµ·ãããŸããïŒ
name digit, ('##') digit â .
type int. , type int . QVariant int .
type int. , type int . QVariant int .
ãããŠããããè€éãªæ§é ã®JSONèšè¿°ã®çæã§ãã
/* Generate JSON-property and methods for some custom class */
/* Custom type must be provide methods fromJson and toJson */
#define QS_JSON_OBJECT(type, name)
Q_PROPERTY(QJsonValue name READ get_json_##name WRITE set_json_##name)
private:
QJsonValue get_json_##name() const {
QJsonObject val = name.toJson();
return QJsonValue(val);
}
void set_json_##name(const QJsonValue & varname) {
if(!varname.isObject())
return;
name.fromJson(varname);
}
...
SomeClass object;
QS_JSON_OBJECT(SomeClass, object)
è€éãªãªããžã§ã¯ãã¯ãå€éšã¯ã©ã¹ã®1ã€ã®ã倧ããªãããããã£ãšããŠæ©èœãããã¹ããããããããã£ã®ã»ããã§ãããã®ãããªãªããžã§ã¯ãã«ã¯ã¯ã€ã€ã¡ãœãããå«ãŸããããã§ãããããè¡ãããã«å¿ èŠãªã®ã¯ãè€éãªæ§é ã®èªã¿åãã¡ãœãããšæžã蟌ã¿ã¡ãœããã§é©åãªã¬ã€ãã¡ãœãããåŒã³åºãããšã ãã§ãã
ã¯ã©ã¹ã®äœæ
ãããã£ãŠãã·ãªã¢ã«åå¯èœãªã¯ã©ã¹ãäœæããããã®éåžžã«åçŽãªã€ã³ãã©ã¹ãã©ã¯ãã£ããããŸãã
ãããã£ãŠãããšãã°ãQSerializerããç¶æ¿ããããšã§ãã¯ã©ã¹ãã·ãªã¢ã«åå¯èœã«ããããšãã§ããŸãã
class SerializableClass : public QSerializer {
Q_GADGET
QS_SERIALIZER
QS_FIELD(int, digit)
QS_COLLECTION(QList, QString, strings)
};
ãŸãã¯ããã®ããã«ãQS_CLASSãã¯ãã䜿çšããŸãã
class SerializableClass {
Q_GADGET
QS_CLASS
QS_FIELD(int, digit)
QS_COLLECTION(QList, QString, strings)
};
JSONã·ãªã¢ã«åã®äŸ
:
, :
JSON:
â , XML , toJson toXml.
example.
class CustomType : public QSerializer {
Q_GADGET
QS_SERIALIZER
QS_FIELD(int, someInteger)
QS_FIELD(QString, someString)
};
class SerializableClass : public QSerializer {
Q_GADGET
QS_SERIALIZER
QS_FIELD(int, digit)
QS_COLLECTION(QList, QString, strings)
QS_OBJECT(CustomType, someObject)
QS_COLLECTION_OBJECTS(QVector, CustomType, objects)
};
, :
SerializableClass serializable;
serializable.someObject.someString = "ObjectString";
serializable.someObject.someInteger = 99999;
for(int i = 0; i < 3; i++) {
serializable.digit = i;
serializable.strings.append(QString("list of strings with index %1").arg(i));
serializable.objects.append(serializable.someObject);
}
QJsonObject json = serializable.toJson();
JSON:
{
"digit": 2,
"objects": [
{
"someInteger": 99999,
"someString": "ObjectString"
},
{
"someInteger": 99999,
"someString": "ObjectString"
},
{
"someInteger": 99999,
"someString": "ObjectString"
}
],
"someObject": {
"someInteger": 99999,
"someString": "ObjectString"
},
"strings": [
"list of strings with index 0",
"list of strings with index 1",
"list of strings with index 2"
]
}
â , XML , toJson toXml.
example.
å¶éäºé
åäžãã£ãŒã«ã
ãŠãŒã¶ãŒå®çŸ©ãŸãã¯ããªããã£ãã¿ã€ãã¯ãããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãæäŸããå¿ èŠããããŸãã
ã³ã¬ã¯ã·ã§ã³
ã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ã¯ãã³ãã¬ãŒãåãããclearãatãsizeãappendã¡ãœãããæäŸããå¿ èŠããããŸããæ¡ä»¶ã«å¿ããŠãç¬èªã®ã³ã¬ã¯ã·ã§ã³ã䜿çšã§ããŸããæ¬¡ã®æ¡ä»¶ãæºããQtã³ã¬ã¯ã·ã§ã³ïŒQVectorãQStackãQListãQQueueã
QtããŒãžã§ã³
æå°ããŒãžã§ã³Qt5.5.0
æå°ãã¹ãããŒãžã§ã³Qt5.9.0
æå€§ãã¹ãããŒãžã§ã³Qt5.15.0
泚ïŒä»¥åã®ããŒãžã§ã³ã®Qtã§QSerializerã®ãã¹ãã«åå ããŠãã¹ãã§ããŸãã
çµæ
QSerializerãäœãçŽããšããç§ã¯ãããå€§å¹ ã«æžãããšããä»äºãèªåèªèº«ã«çµ¶å¯Ÿã«èšå®ããŸããã§ããããã ãããµã€ãºã¯9ãã¡ã€ã«ãã1ãã¡ã€ã«ã«æžå°ããè€éãã軜æžãããŸããã QSerializerã¯ãéåžžã®åœ¢åŒã®ã©ã€ãã©ãªã§ã¯ãªããªããŸããããããžã§ã¯ãã«å«ããŠãå¿«é©ãªã·ãªã¢ã«å/éã·ãªã¢ã«åã®ããã®ãã¹ãŠã®æ©èœãååŸããããã«å¿ èŠãªããããŒãã¡ã€ã«ã«ãªããŸãããéçºã¯3æã«å§ãŸããããªãããŒãªã¢ãŒããã¯ãã£ãçºæããããããžã§ã¯ãã¯äŸåé¢ä¿ãã¯ã©ããã0ããæ°åæžãçŽãããŠå€§ãããªããããŸããããããŠããã¹ãŠãæçµçã«å°ããªãã¡ã€ã«ã«å€ããããã«ã
ãããã«è²»ãããåªåã®äŸ¡å€ã¯ãã£ãã®ãããšèªåãããã¯ããããã ã£ãããšçããŸããç§ã¯ãã§ã«æŠéãããžã§ã¯ãã§ããã詊ããŸããããããŠçµæã¯ç§ãåã°ããŸããã
ãªã³ã¯
GitHubïŒãªã³ã¯
ææ°ãªãªãŒã¹ïŒv1.1
åã®èšäºïŒQSerializerïŒåçŽãªJSON / XMLã·ãªã¢ã«åã®ãœãªã¥ãŒã·ã§ã³
å°æ¥ã®ãªã¹ã
- å€§å¹ ãªã³ã¹ãåæžïŒããã«å®ãã§ããïŒ
- ã³ã³ãã¯ãã
- éèŠãªã¿ã€ãã®æäœ
- ã·ãªã¢ã«åå¯èœãªããŒã¿ã®åºæ¬çãªèª¬æ
- clearãatãsizeãããã³appendã¡ãœãããæäŸãããã³ãã¬ãŒãã³ã¬ã¯ã·ã§ã³ã®ãµããŒããèªåã§ã
- ãã·ãªã¢ã©ã€ãºã«é¢ããå®å šã«å€æŽå¯èœãªã³ã¬ã¯ã·ã§ã³
- ãã¹ãŠã®äžè¬çãªããªããã£ãã¿ã€ãã®ãµããŒã
- QSerializerã䜿çšããŠèšè¿°ãããã«ã¹ã¿ã ã¿ã€ãã®ãµããŒã
- ã«ã¹ã¿ã ã¿ã€ããç»é²ããå¿ èŠã¯ãããŸãã