SQLite는 관계형 데이터베이스이며, 그 일을 직접 C++ 객체를 저장할 수 없습니다.
은 실제로 C++ 객체 모델은 완전히 투명한 지속성을 허용하지 않습니다하지만 당신은 특수 도구 또는 라이브러리를 사용하여 어느 정도 가까이 시도 할 수 있습니다. 그러나 중요한 점은 객체 자체가 지속성을 지원하도록 설계되어야한다는 것입니다.
투명한 지속성이 필요하지 않지만 개체의 명시 적 저장/검색 만 필요한 경우 원하는 직렬화 방법 (예 : 단일 문자열 사용, 속성에 별도 필드 사용)을 선택할 수 있습니다. 각 방법에는 데이터베이스로 수행하려는 작업 (예 : 수행 할 검색 또는 업데이트의 종류)에 따라 장단점이 있습니다. 또한 C에 대한 불행한 일이다
뭔가 ++의 메타 프로그래밍 능력이 매우 (C보다는 조금 더 나은) 가난하고 예를 들어 반성이 불가능위한 것입니다.
즉, 지원해야 할 각 클래스에 대해 serialization 코드를 작성해야하거나 클래스 정의 .h
이 필요한 코드를 생성하는 외부 도구를 찾고/구입해야합니다. 직렬화는 템플릿 메타 프로그래밍의 제한된 범위 밖에있는 것이므로 외부 도구 여야합니다. 예를 QRect
가 직렬화 및 T
경우 QList<T>
가 직렬화를 위해 :
Qt는 자체가 이미 당신이 찾고있는 것을 위해 그것을 사용할 수있을 수 있으므로 일부 전문 직렬화 기계 QDataStream
있습니다. QByteArray
첫째로 직렬화하고 SQLite는 내부의 덩어리를 저장하기 위해 필요로하는 사용
.예를 들어
template<typename T>
QByteArray serialize(const T& x)
{
QByteArray ba;
QDataStream s(&ba, QIODevice::WriteOnly);
s << x;
return ba;
}
template<typename T>
T deserialize(QByteArray& ba)
{
QDataStream s(&ba, QIODevice::ReadOnly);
T res; s >> res;
return res;
}
를 작성 후, 당신은
QByteArray ba = serialize(x);
와 QByteArray
에 직접 객체를 직렬화 할 수 있으며, 내가하는 구형의 원시 바이트를 읽을 줄
X x = deserialize<X>(ba);
로 직렬화 할 수 있습니다 (멤버는 메모리에서 순차적입니다) 문자열로 DB에 저장 한 다음 빠른 바이너리 "초기화"를 수행하기 위해 rect의 메모리 주소로 문자열을 다시 복사하십시오. – dtech