Это новый тип вопросов. У меня есть файл, сохраненный с помощью метода writeObject в Java. Мне нужно читать с использованием C ++ для кода на основе C ++. Я пытался читать, используя метод чтения двоичных файлов, но я не мог читать правильно.
char buffString[50];
char buffer[100];
std::ifstream conFile(configFileName, std::ios::in|std::ios::binary);
//conFile.read(buffer, 100);
std::cout << buffer << std::endl;
if (!conFile) {
std::cout << " Error reading thee file " << std::endl;
} else {
std::cout << "Trying to read." << std::endl;
conFile.seekg(0);
conFile.read(buffer,14); strcpy(buffString, buffer);
std::cout << buffString << " buffer " << buffer << std::endl;
}
Файл данных, на который указывает этот conFile, содержит строку, целое и двойное число. Файл содержит что-то вроде следующего:
trapezDET.pngtcmstMeVsr? java.lang.DoubleJ) kDvaluexr? java.lang.Number
Pxp @ dsq ~ @ Nsq ~ @ dsq ~ @ V srjava.lang.Integer ⠤ 8 Ivaluexq ~ sq ~? sq ~ sq ~? Ə sq ~ q ~ sq ~ @ F кв ~? ~ кв? кв ~? ~ кв? ZG {t5 / дома / вега / NetBeansProjects / Том / данные / 6133.root
Я искал в сети, пока я не мог понять это.
Спасибо и всего наилучшего
Спецификация сериализации Java довольно хорошо определена. Я думаю, что это последняя спецификация:
https://docs.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html
Однако будет не очень легко создать что-то, что читает этот формат файла. Если возможно, на стороне Java следует использовать более переносимый формат вывода.
(Вот ссылка на часть, которая фактически говорит о двоичной спецификации: https://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html )
Вы сможете сделать это для простых и фиксированных классов, таких как java.lang.String
, но в целом ответ таков: вы не можете. В общем случае вам понадобится JVM для декодирования такого файла. Причина в том, что любой класс может определить свой собственный субпротокол Serialization, и только код в этом классе знает, что это за субпротокол, и единственный способ выполнить этот код — с помощью JVM.