2012-01-02 4 views
2

C++ 객체 직렬화 라이브러리를 만들고 있습니다. 이것은 자기 학습과 향상에 대한 것입니다. & 나는 boost 또는 google protocol buf와 같은 off-the-shelf 라이브러리를 사용하고 싶지 않습니다. 태그 값 등으로 인코딩하는 것과 같은 좋은 방법에 대해 경험이나 의견을 공유하십시오. POD를 지원하고 비선형 DS를 지원하는 것으로 시작하고 싶습니다.C++ 객체 직렬화 기법에 대한 제안

감사 추신 : HNY2012

답변

0

나는 몇 년 전에 기사를 썼다. 코드와 도구는 쓸모 없지만 개념은 동일하게 유지 될 수 있습니다.

this이 도움이 될 수 있습니다.

+0

감사합니다. @Emilio Garavaglia. 내가 당신의 통찰력에 대한 기사를 살펴 보겠습니다 – sanjayk79

1

프로세스 간 통신을 위해 직렬화가 필요한 경우 인터페이스 정의에 몇 가지 인터페이스 언어 (IDL 또는 ASN.1)를 사용하는 것이 좋습니다.

그래서 (C++이 아닌) 다른 언어도 쉽게 지원할 수 있습니다. 또한 코드/스텁 생성기를 쉽게 구현할 수 있습니다.

+0

예, 내 의도는 전선에 물건을 보내는 것입니다. IDL/ASN을 사용하는 경우.1 그러면 필자는 본질적으로 (BER/PER) 등을 사용할 데이터 유형을 인코딩하기 위해 해당 컴파일러 (idl 컴파일러)를 사용해야 할 것입니다. 데이터를 포장하고 전송하기 위해 자체 인코딩을 정의하려고했습니다. – sanjayk79

1

저는 지난 몇 달 동안 비슷한 작업을 해왔습니다. 기존의 클래스 (거대한 기존 코드베이스)를 일련 번호로 직렬화하는 작업 이었기 때문에 부스트를 사용할 수 없었고 클래스가 serialize() 가상 함수 (다중 상속을 원하지 않음)가있는 인터페이스를 상속하는 것은 부적절했습니다. .

취한 접근 방식은 다음과 같은 두드러진 특징이 있었다 :

  1. 가 특정 클래스를 직렬화하는 작업으로 지정된 기존의 각 클래스에 대한 헬퍼 클래스를 만들고 도우미 클래스를 클래스가 직렬화되는 친구를 만들기를 . 이렇게하면 직렬화되는 클래스에서 상속을 피할 수 있으며 또한 도우미 클래스가 개인 변수에 액세스 할 수 있습니다.
  2. 각 도우미 클래스 ('serializer'라고 부름)를 글로벌지도에 등록하십시오. 각 serializer 클래스는 clone() 가상 함수 ('prototype'패턴)를 구현합니다.이 함수를 사용하면이지도에서 클래스 이름을 사용하여 serializer에 대한 포인터를 검색 할 수 있습니다. 이름은 컴파일러 관련 RTTI 정보를 사용하여 얻을 수 있습니다. 전역 맵에 대한 등록은 정적 포인터를 인스턴스화하고 new를 사용하여 처리됩니다. 정적 변수는 프로그램이 시작되기 전에 생성되기 때문입니다.
  3. 비 포인터, 포인터 및 STL 데이터 형식을 serialize하는 템플릿 함수가 포함 된 특수 스트림 개체가 만들어졌습니다 (std::fstream에서 파생 됨). 스트림 객체는 읽기 전용 또는 쓰기 전용 모드로만 열 수 있으므로 (코드에 따라) 동일한 serialize() 함수를 사용하여 파일에서 읽거나 파일에 쓸 수 있습니다. 개울이 열렸다. 따라서 반원들의 읽기와 쓰기의 순서가 불일치 할 가능성은 없습니다.
  4. 모든 개체가 저장되거나 복원 될 때마다 고유 한 태그 (정수)가 변수의 주소를 기반으로 만들어져지도에 저장됩니다. 동일한 주소가 다시 발생하면 태그 만 저장되고 딥 복사 된 개체는 저장되지 않습니다. 따라서 각 개체는 파일로 한 번만 완전히 복사됩니다.

위의 공유 아이디어 중 일부는 http://www.cs.sjsu.edu/~pearce/modules/lectures/cpp/Serialization.htm입니다. 희망이 도움이됩니다.

+0

[Boost로 클래스를 직렬화 할 수 있도록하기 위해 어떤 것도 상속하지 않아도됩니다.] (http://www.boost.org/doc/libs/1_48_0/libs/serialization/doc/tutorial.html#nonintrusiveversion). public 인터페이스가 클래스를 직렬화하기에 충분하지 않지만 어떤 것도 상속 할 필요가 없다면 private 변수가'serialize()'함수에서 볼 수 있도록 클래스를 수정해야 할 수도 있습니다. –

+0

동의. 그러나 Boost는 우리가 이미 가지고 있던 복잡한 계층을 감안할 때 너무 복잡해졌습니다. 손으로 한 것은 장기적으로 더 적절하고 유지 보수가 가능한 것처럼 보였습니다. – Somesh

+0

감사합니다. 귀하의 의견은 정말 도움이됩니다. 나는 당신이 제공 한 링크를 통해 갈 것입니다. 나는 네트워크를 통해 통신하기 위해 직렬화 된 객체를 사용할 것이다. 또한이 기사에서는 비선형 DS (good thats)에 대한 지원에 대해서도 설명합니다. 내가 첫 번째 프로토 타입을 가지고 나면 더 많은 논의를 해보겠습니다 :) – sanjayk79