> 백엔드 개발 > C++ > C에서 std::string을 포함하는 클래스를 올바르게 직렬화하는 방법은 무엇입니까?

C에서 std::string을 포함하는 클래스를 올바르게 직렬화하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-10 03:41:09
원래의
624명이 탐색했습니다.

How to Properly Serialize a Class Containing an std::string in C  ?

std::string이 포함된 클래스 직렬화: 포인터 딜레마 이해

직렬화는 객체의 상태를 보존하는 데 사용되는 중요한 기술입니다. 저장 또는 전송을 위해. 그러나 std::strings가 포함된 클래스를 직렬화하는 것은 std::strings의 포인터 특성으로 인해 문제가 발생합니다.

이 문제는 std::string이 포함된 클래스를 char로 캐스팅하여 직렬화하려고 할 때 발생합니다. * 그리고 그것을 파일에 씁니다. 이 접근 방식은 단순한 데이터 유형에는 작동하지만 포인터 종속성을 고려하지 않기 때문에 std::strings에서는 실패합니다.

포인터 직렬화에 대한 표준 해결 방법

극복하려면 이 문제의 표준 해결 방법에는 클래스에 직렬화 및 역직렬화 메서드를 도입하는 것이 포함됩니다. 이러한 메서드는 포인터를 포함하여 개체의 내부 데이터 쓰기 및 읽기를 수동으로 처리합니다.

구현 예는 다음과 같습니다.

// Serialization method
std::ostream& MyClass::serialize(std::ostream &out) const {
    // Serialize numeric values using the output stream
    out << height;
    out << ',' // Separator
    out << width;
    out << ',' // Separator
    
    // Serialize the std::string
    out << name.size(); // String length
    out << ',' // Separator
    out << name; // String characters
    
    return out;
}

// Deserialization method
std::istream&amp; MyClass::deserialize(std::istream &amp;in) {
    if (in) {
        // Deserialize numeric values using the input stream
        int len=0;
        char comma;
        in >> height;
        in >> comma; // Separator
        in >> width;
        in >> comma; // Separator
        
        // Deserialize the std::string
        in >> len; // String length
        in >> comma; // Separator
        if (in &amp;&amp; len) {
            std::vector<char> tmp(len);
            in.read(tmp.data() , len); // String characters
            name.assign(tmp.data(), len);
        }
    }
    return in;
}
로그인 후 복사

스트림 연산자를 오버로드하면 이러한 메서드의 사용을 단순화할 수 있습니다. 메서드:

std::ostream &amp;operator<<(std::ostream&amp; out, const MyClass &amp;obj)
{obj.serialize(out); return out;}
std::istream &amp;operator>>(std::istream&amp; in, MyClass &amp;obj)
{obj.deserialize(in); return in;}
로그인 후 복사

이러한 기술을 사용하면 std::strings를 더 큰 문자열의 일부로 효과적으로 직렬화 및 역직렬화할 수 있습니다. 클래스를 사용하여 무결성과 포인터 종속성을 유지합니다.

위 내용은 C에서 std::string을 포함하는 클래스를 올바르게 직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿