일반 객체를 문자열로 직렬화 / 역 직렬화

RoBo

다음 코드를 사용하여 일반 사용자 지정 구조를 직렬화 / 비 직렬화하는 데 사용하려는 일반 직렬화 메서드를 구현하려고합니다.

#include <string>
#include <iostream>

class MessageSerializer
{
public: 
    MessageSerializer(){}

    ~MessageSerializer(){}

    template <typename Data>
    std::string serialize(const Data data)
    {
        const char* lpData = reinterpret_cast<const char*>(&data);
        std::string serializedData( lpData, sizeof(data));
        return serializedData;
    } 

    template <typename Data> 
    void deSerialize( const std::string &serializedData, Data &deserializedObject )
    {
        const size_t serializedDataSize = serializedData.size();
        const size_t outputDataSize = sizeof(Data);

        if ( serializedDataSize != outputDataSize ){
            std::cout << "Failed size check" << std::endl; 
        }

        std::copy(std::begin(serializedData), std::end(serializedData), reinterpret_cast<char*>(&deserializedObject));
    }
};

#pragma pack(push, 1)
struct testStruct 
{
    testStruct(int a, double f, std::string text, char c) : _a(a), _f(f), _text(text), _c(c){}
    testStruct(){}

    int _a; 
    double _f; 
    std::string _text;
    char _c;
};
#pragma pack(pop) ```

내 메인에서 사용할 때 :



    #include "serializer.hpp"
#include <iostream>
#include <string>

int main ()
{
    MessageSerializer ser;
    testStruct sender(1, 345.234, "this is a test string", 'h'); 

    testStruct receiver; 
    std::string msg = ser.serialize(sender);
    std::cout <<"serialized: " << msg << std::endl; 

    std::cout << "-------------" << std::endl;

    ser.deSerialize(msg, receiver);
    
    std::cout << "received content: \na= " << receiver._a 
                << "\nf: " << receiver._f 
                << "\ntext: " << receiver._text 
                << "\nc: " << receiver._c << std::endl;
    return 0; 
}

내 메인이 끝나면 다음과 같은 오류 메시지가 표시됩니다.

free () : tcache 2에서 이중 해제가 감지되었습니다. 중단됨 (코어 덤프 됨)

정확한 원인을 찾을 수없는 것 같습니다. 몇 가지 조사를 마친 후 두 번째로 할당되지 않은 리소스가 두 번 해제되고 있음을 이해하지만 힙에 아무 메모리도 할당하지 않습니다.

아무도 내 문제의 원인을 이해하도록 도와 줄 수 있습니까?

그 타놉

내가 생각할 수있는 한 가지 문제 sizeof(testStruct)는 실제로 포함 된 각 요소 유형의 크기와 거의 동일 하다는 사실입니다 .

sizeof(int) + sizeof(double) + sizeof(std::string) + sizeof(char)

결과 크기는 std::string객체 의 실제 내용 () 전체를 포함하지 "this is a test string"않지만 대신 testStruct포함 하는 기본 데이터 유형 의 크기에 포함 된 기본 데이터 유형 의 크기 std:string( 내용 자체가 아닌 내용에 대한 포인터).

따라서 testStructby 값을 serialize메소드에 전달하기 때문에 메소드 "this is a test string"종료시 포함 된 std::string객체를 파괴하면 해제 될 문자 시퀀스에 대한 포인터를 복사 serialize하는 것과 같을 것이며, 동일한 포인터는 다음과 같은 경우에도 해제 될 것입니다. 프로그램이 종료됩니다 (왜냐하면 메인에서도 senderstd::string객체 로 선언되기 때문입니다 ).

당신은 당신의 포장 std::stringtestStruct구조체 (소멸자를 가지고있는?)하지만 그냥 단지 일반으로 테스트하는 경우 이것은 아마도 발생할 수있는 std::string당신과 같은 오브젝트 sender값.

이것이 일어나고있는 것처럼 보이지만 완전히 확실하지 않으므로 가정 / 가설에서 내가 틀렸다면 수정하십시오.

편집 1 :

첫 번째 의견에 대한 답변으로 : char*텍스트의 내용이 다시 복사되지 않을 것임을 의미하기 때문에 텍스트에를 사용할 수 없습니다 . 실제 포인터의 값만 인코딩됩니다. 고정 된 크기 char배열 (예 : say 또는 something)을 사용하고 거기에 텍스트를 저장할 수 있지만 다음과 같습니다.char[100]

  1. 저장할 최대 문자 수를 정확히 알아야하는 문제와 .NET Framework 인스턴스에 필요한만큼 많은 문자가 필요하지 않더라도 모든 문자를 할당해야하는 문제를 소개합니다 testStruct.
  2. 각 기본 데이터 유형의 크기가 아키텍처에 따라 다르기 때문에 바이너리 표현이 이식 가능하지 않을 것이라는 사실을 변경하지 않습니다.


https://isocpp.org/wiki/faq/serialization 링크를 살펴보고
조금 읽어 보시기 바랍니다 . 도움이 될 수 있습니다.

텍스트 표현 (예 : XML 또는 일반 사용자 정의 구조 텍스트)을 원하는 경우 다시 이식 할 수 없다는 점을 기억하십시오. 예를 들어 int값 (예 : 2 ^ 30) 으로 여러 유형을 인쇄하면 다른 int크기가 2 바이트 인 아키텍처에서는 값이 오버플로됩니다. 그러나 아마도 cstdint 유형 (예 : 등) 으로이 문제를 해결할int_least32_t있지만 모든 데이터를 숫자로 인코딩해야합니다. 너무 어렵지 않을 수도 있고 그렇지 않을 수도 있습니다. 특정 텍스트 인코딩 테이블 (예 : ASCII, UTF-8 등)을 사용하는 것을 의미합니다.

C ++에서 객체를 직렬화하는 방법에 대한 다른 게시물을 볼 수도 있습니다 .

바이너리 표현과 이식성과 쉬운 구현을 원한다면 가능한 한 언어를 Java로 변경 한 다음 Serializable인터페이스와 규칙을 살펴 보는 것이 좋습니다 . Java와의 차이점은 고정 된 크기의 원시 데이터 유형이 있고 내가 아는 한 아키텍처에 의존하지 않는다는 것입니다.

동일한 프로세스에서 복잡한 개체 만 복사하려면 복사 생성자를 사용합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ServiceStack은 객체로 사전 직렬화 및 역 직렬화

분류에서Dev

Collection + JSON 객체로 역 직렬화

분류에서Dev

JSON을 .net 객체로 역 직렬화

분류에서Dev

Mongodb 문자열을 객체로 역 직렬화

분류에서Dev

JSON 문자열을 객체로 역 직렬화하는 방법

분류에서Dev

디스크에서 객체로 직접 JSON 파일 역 직렬화

분류에서Dev

객체를 문자열로 직렬화

분류에서Dev

객체를 문자열로 직렬화

분류에서Dev

역 직렬화 할 수없는 일부 개체를 포함하는 배열 역 직렬화 (역 직렬화 가능 부분 구하기)

분류에서Dev

ExpandoObject를 개체로 역 직렬화

분류에서Dev

C # HttpResponseMessage를 개체로 역 직렬화

분류에서Dev

개체 직렬화 후 list <object> C #으로 역 직렬화

분류에서Dev

Jackson ObjectMapper는 배열로 객체를 역 직렬화합니다.

분류에서Dev

자식 직렬화 및 역 직렬화

분류에서Dev

여러 개체를 단일 XML 파일로 직렬화 / 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

분류에서Dev

JavaScriptSerializer로 JSON 문자열을 역 직렬화하여 키 및 값 배열 대신 단일 동적 객체를 반환합니다.

분류에서Dev

Spring + Jackson + 일반 객체 목록 역 직렬화

분류에서Dev

xml 문서를 역 직렬화 할 수 있지만 동일한 문서로 직렬화 할 수 없음

분류에서Dev

json 문자열을 .NET 개체 목록으로 역 직렬화

분류에서Dev

JSON 문자열을 C # 및 Unity의 개체로 역 직렬화

분류에서Dev

json 문자열을 개체 C # .net으로 역 직렬화

분류에서Dev

CSV 문자열을 C # 개체로 역 직렬화

분류에서Dev

빈 개체 "{}"로 문자열 속성 역 직렬화

분류에서Dev

Qt / C ++ 일반 객체를 QSettings로 직렬화

분류에서Dev

Json .Net은 플랫 객체를 복잡한 객체로 직렬화합니다 (직렬화 / 역 직렬화에 대한 객체 구조 변경).

분류에서Dev

json 결과를 동적 객체로 역 직렬화

분류에서Dev

XML xmpp 메시지를 객체로 역 직렬화

분류에서Dev

객체를 사전으로 역 직렬화하는 JSON

Related 관련 기사

  1. 1

    ServiceStack은 객체로 사전 직렬화 및 역 직렬화

  2. 2

    Collection + JSON 객체로 역 직렬화

  3. 3

    JSON을 .net 객체로 역 직렬화

  4. 4

    Mongodb 문자열을 객체로 역 직렬화

  5. 5

    JSON 문자열을 객체로 역 직렬화하는 방법

  6. 6

    디스크에서 객체로 직접 JSON 파일 역 직렬화

  7. 7

    객체를 문자열로 직렬화

  8. 8

    객체를 문자열로 직렬화

  9. 9

    역 직렬화 할 수없는 일부 개체를 포함하는 배열 역 직렬화 (역 직렬화 가능 부분 구하기)

  10. 10

    ExpandoObject를 개체로 역 직렬화

  11. 11

    C # HttpResponseMessage를 개체로 역 직렬화

  12. 12

    개체 직렬화 후 list <object> C #으로 역 직렬화

  13. 13

    Jackson ObjectMapper는 배열로 객체를 역 직렬화합니다.

  14. 14

    자식 직렬화 및 역 직렬화

  15. 15

    여러 개체를 단일 XML 파일로 직렬화 / 역 직렬화하는 방법은 무엇입니까?

  16. 16

    파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

  17. 17

    JavaScriptSerializer로 JSON 문자열을 역 직렬화하여 키 및 값 배열 대신 단일 동적 객체를 반환합니다.

  18. 18

    Spring + Jackson + 일반 객체 목록 역 직렬화

  19. 19

    xml 문서를 역 직렬화 할 수 있지만 동일한 문서로 직렬화 할 수 없음

  20. 20

    json 문자열을 .NET 개체 목록으로 역 직렬화

  21. 21

    JSON 문자열을 C # 및 Unity의 개체로 역 직렬화

  22. 22

    json 문자열을 개체 C # .net으로 역 직렬화

  23. 23

    CSV 문자열을 C # 개체로 역 직렬화

  24. 24

    빈 개체 "{}"로 문자열 속성 역 직렬화

  25. 25

    Qt / C ++ 일반 객체를 QSettings로 직렬화

  26. 26

    Json .Net은 플랫 객체를 복잡한 객체로 직렬화합니다 (직렬화 / 역 직렬화에 대한 객체 구조 변경).

  27. 27

    json 결과를 동적 객체로 역 직렬화

  28. 28

    XML xmpp 메시지를 객체로 역 직렬화

  29. 29

    객체를 사전으로 역 직렬화하는 JSON

뜨겁다태그

보관