2011-01-13 4 views
5

두 가지 구성 요소가있는 분산 응용 프로그램에서 작업 중입니다. 하나는 표준 C++ (관리되지 않는 C++ 및 Linux 플랫폼에서 실행)로 작성되었으며 다른 하나는 C#으로 작성되었습니다. 둘 다 메시지 버스를 통해 통신합니다.C++ 및 C#의 이진 직렬화/비 직렬화

나는 C++에서 C# 응용 프로그램으로 개체를 전달해야하므로이 개체를 C++로 serialize하고 C# (마샬링/언 마샬링 .NET과 같은 기능)에서 직렬화해야하는 상황이 있습니다. . 필자는이 직렬화를 XML로하지 않고 바이너리로 수행해야합니다 (성능상의 이유로).

Boost.Serialization은 양쪽 끝이 C++로 구현되었지만 이제는 한쪽 끝에 .NET 응용 프로그램이 있으므로 Boost.Serialization은 실행 가능한 솔루션이 아닙니다.

저는 C++ 및 .NET 경계 (즉, 크로스 플랫폼 이진 직렬화)에서 직렬화를 수행 할 수있는 솔루션을 찾고 있습니다.

C++ DLL에 (비) 직렬화 코드를 구현하고 .NET 응용 프로그램에서 P/Invoke을 사용할 수 있다는 것을 알고 있지만 최후의 수단으로 사용하고 싶습니다.

또한 gzip과 같은 표준을 사용하고 있는지 알고 싶습니다. 효율적입니까? gzip에 대한 다른 대안이 있습니까? 그것들의 장단점은 무엇입니까?

감사

+0

가장 좋은 제안은하지 않는 것입니다. json, xml 또는 다른 것을 사용하여 데이터를 전송하십시오. 처음에 너무 느리게 끝나면 무엇이 시간이 걸리는지 분석하십시오. – Cine

+1

XML 직렬화로 시작했고 이진 직렬화 (양쪽에서 C++ 응용 프로그램을 실행하는 것)와 비교할 때 속도가 느려졌습니다. 이것이 내가 Boost를 선택한 이유입니다. 처음에는 직렬화를 사용했습니다. –

+0

간단한 COM 응용 프로그램, C++ 및.NET은 내가 아는 한 COM 기술을 지원합니다. –

답변

4

GZIP는 직접 직렬화와 도움이되지 않습니다 - 그냥 (시도하는) 스트림을 축소합니다. 이 일 수 있으며 스트림의 중복 된 데이터 양에 따라 다릅니다. 텍스트가 적은 고밀도 데이터의 경우 gzip 이 페이로드의 크기 인으로 증가했습니다.

개인적으로 나는 protocol buffers을 볼 것입니다 (그러나 나는 many extensions의 저자 중 한 명으로 편향되어 있습니다). 일반적으로 (항상 그런 것은 아님) 기본 언어 (.proto 파일)로 메시지를 정의하고 언어 관련 도구를 실행하여 클래스를 생성합니다. 이 훨씬이 (123)

+0

+1에 대한 제안 PB –

5

나는 구글의 자신의 직렬화 라이브러리입니다 프로토콜 버퍼를 추천 할 것입니다. 닷넷, C++ 및 자바 시리얼 라이저를 모두 가지고 있습니다. 대부분의 구현 또한 매우 빠릅니다.

http://code.google.com/p/protobuf/

+0

제안을 위해. 나는 그것을 들여다 볼 것이다. –

3

또 다른 가능성은 Thrift 것, 그것은 더 많은 백엔드을 가진 붙박이 시리얼을 초과 할 수 .NET에 초점을 맞추고 필요한 경우는 필요한 코드의 좋은 부분을 제공 - 성능이 매우 좋다 네트워크 통신 - 확장하려는 경우를 대비하여

쉬운 개체 직렬화 만 원한다면 json.org를 봐야 할 것입니다. C++/.NET 구현이 많이 있습니다.