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& MyClass::deserialize(std::istream &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 && len) { std::vector<char> tmp(len); in.read(tmp.data() , len); // String characters name.assign(tmp.data(), len); } } return in; }
스트림 연산자를 오버로드하면 이러한 메서드의 사용을 단순화할 수 있습니다. 메서드:
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를 더 큰 문자열의 일부로 효과적으로 직렬화 및 역직렬화할 수 있습니다. 클래스를 사용하여 무결성과 포인터 종속성을 유지합니다.
위 내용은 C에서 std::string을 포함하는 클래스를 올바르게 직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!