std::string 멤버를 사용하여 클래스 직렬화
std::string이 포함된 클래스를 직렬화할 때 " 범위를 벗어난 주소" 오류는 std::string이 힙 할당 메모리를 가리키는 동적 데이터 구조이기 때문입니다. 클래스를 char*로 캐스팅하고 파일에 쓰면 실제 내용이 아닌 문자열의 메모리 주소만 캡처됩니다.
이 문제를 해결하려면 다음 접근 방식을 고려하세요.
사용자 정의 직렬화 및 역직렬화 기능:
void 구현 클래스의 MyClass::serialize(std::ostream) 및 void MyClass::deserialize(std::istream) 멤버 함수. 이러한 함수는 std::string을 포함한 모든 멤버 변수의 직렬화 및 역직렬화를 처리합니다.
직렬화 논리:
직렬화( ), std::string의 크기를 스트림에 기록하고 그 뒤에 해당 문자를 기록합니다. 이렇게 하면 문자열 데이터가 클래스 객체와 별도로 직렬화됩니다.
역직렬화 논리:
역직렬화()에서 문자열의 크기를 읽습니다. 스트림에서 해당 문자가옵니다. 이 정보를 사용하여 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; }
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!