Я искал на многих форумах, но еще не нашел ответа на вопрос. Я прочитал несколько тем от людей, имеющих ту же проблему, что и я, здесь, на этом сайте, но большинство из них использовали аплеты и сервлеты, и я не мог понять, что я делаю неправильно по сравнению с ними.java.io.StreamCorruptedException: недопустимый заголовок потока: 5B42403
В любом случае, по моей проблеме. Недавно я недавно изучил MySQL, поэтому, если вы видите что-нибудь ужасное, простите меня. Я пытаюсь взять сериализуемый объект и записать его в таблицу в MySQL. Из исследования, которое я сделал, я понял, что мне нужно использовать BLOB в качестве поля и что мне нужно будет написать его с помощью байта []. Написание работает отлично, никаких проблем, но когда я пытаюсь его прочитать, я получаю вышеуказанную ошибку.
Мой метод записи:
public void addColonist(String p, Colonist c) {
// Serializing the Colonist
ByteArrayOutputStream baos;
baos = new ByteArrayOutputStream();
byte[] byteObject = null;
try {
out = new ObjectOutputStream(baos);
out.writeObject(c);
out.flush();
out.close();
baos.flush();
byteObject = baos.toByteArray();
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
// Adding it to MySQL
sql.query("INSERT INTO colonistdb (`player`, `colonist`) VALUES('" + p + "', '" + byteObject + "')");
}
И мой чтения/найти метод:
public Colonist getColonist(String p) {
// Getting the object from MySQL
ResultSet rs = sql.query("SELECT `colonist` FROM colonistdb WHERE `player` = '" + p + "'");
byte[] byteObject = null;
try {
if (rs.first()) {
byteObject = (byte[]) rs.getObject("colonist");
}
} catch (SQLException e) {
return null;
}
if (byteObject == null) {
System.out.println("byteObject is null");
return null;
}
// Deserializing it for use
ByteArrayInputStream bais;
Colonist colonist = null;
try {
bais = new ByteArrayInputStream(byteObject);
in = new ObjectInputStream(bais);
colonist = (Colonist) in.readObject();
in.close();
bais.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
System.out.println("Colonist successfully retrived");
return colonist;
}
Из того, что я прочитал на кучу других вопросов и сообщений, я, возможно, потребуется сделать ObjectOutputStream в моем методе чтения, но я старался, что без толку ...
Любая помощь очень ценится :)
Я ответил на ваш вопрос, но вы не должны хранить ваши объекты в двоичном формате в базе данных. Каждый раз, когда вы вносите изменения в свой объект, например добавление или удаление, все старые, хранящиеся в базе данных, не смогут быть прочитаны правильно. Также вы не можете делать какие-либо запросы, как только выберите колонистов, у которых есть имя, начинающееся с «rich». В идеале, каждый класс, который вы не должны сохранять, должен иметь свою собственную таблицу в базе данных. – Hiro2k
Ну, на самом деле это плагин для сервера minecraft, для которого я «работаю». Он не используется, поэтому проблема добавления/удаления полей на данный момент не является проблемой. Я всегда мог сделать обновление для старого файла, хотя я не мог? – Perdog
@ Hiro2k Это неверно. Добавление или удаление полей не прерывает совместимость при сериализации. Это подробно обсуждается в главе «Версии объектов» в разделе «Сериализация объектов». – EJP