>백엔드 개발 >C++ >std::string 멤버를 사용하여 C 클래스를 올바르게 직렬화하는 방법은 무엇입니까?

std::string 멤버를 사용하여 C 클래스를 올바르게 직렬화하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-03 14:00:20805검색

How to Properly Serialize a C   Class with a std::string Member?

std::string 멤버를 사용하여 클래스 직렬화

std::string이 포함된 클래스를 직렬화할 때 " 범위를 벗어난 주소" 오류는 std::string이 힙 할당 메모리를 가리키는 동적 데이터 구조이기 때문입니다. 클래스를 char*로 캐스팅하고 파일에 쓰면 실제 내용이 아닌 문자열의 메모리 주소만 캡처됩니다.

이 문제를 해결하려면 다음 접근 방식을 고려하세요.

  1. 사용자 정의 직렬화 및 역직렬화 기능:

    void 구현 클래스의 MyClass::serialize(std::ostream) 및 void MyClass::deserialize(std::istream) 멤버 함수. 이러한 함수는 std::string을 포함한 모든 멤버 변수의 직렬화 및 역직렬화를 처리합니다.

  2. 직렬화 논리:

    직렬화( ), std::string의 크기를 스트림에 기록하고 그 뒤에 해당 문자를 기록합니다. 이렇게 하면 문자열 데이터가 클래스 객체와 별도로 직렬화됩니다.

  3. 역직렬화 논리:

    역직렬화()에서 문자열의 크기를 읽습니다. 스트림에서 해당 문자가옵니다. 이 정보를 사용하여 std::string 개체를 재구성합니다.

다음은 이러한 함수의 예입니다.

std::ostream& MyClass::serialize(std::ostream &out) const {
    out << height;
    out << ',' << width;
    out << ',' << name.size();
    out << ',' << name;
    return out;
}
std::istream& MyClass::deserialize(std::istream &in) {
    if (in) {
        in >> height;
        in >> width;
        int len;
        in >> len;
        name.resize(len);
        in >> name;
    }
    return in;
}
  1. Stream 연산자 오버로딩:

    편리한 사용을 위해 오버로드할 수도 있습니다. 클래스에 대한 스트림 연산자:

std::ostream &operator<<(std::ostream& out, const MyClass &obj) {
    obj.serialize(out); return out;
}
std::istream &operator>>(std::istream& in, MyClass &obj) {
    obj.deserialize(in); return in;
}

사용자 정의 직렬화 및 역직렬화 기능을 구현하면 std::strings가 포함된 클래스를 효율적이고 안정적으로 직렬화 및 역직렬화할 수 있습니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.