Задать вопрос
@Alecxandrys

Преобразование BLOB к ArrayList?

День добрый
При обратной выгрузке ArrayList из БД происходит ошибка.
Ошибка на третьей строке. ArrayList был сохранен корректно.
java.io.EOFException единственное что ловится при дебаге, деталей нет, при обычной работе консоль не выводит ошибок.
while (resultSet.next()) {
                Blob obj = resultSet.getBlob("DECK");
                ObjectInputStream obin2 = new ObjectInputStream(obj.getBinaryStream());

                ArrayList<CabinetSquad> decka = (ArrayList<CabinetSquad>) obin2.readObject();
                String name = resultSet.getString("NAME");
                String description = resultSet.getString("DESCRIPTION");
                Deck deck = new Deck(decka, name, description);
                Decks.add(deck);
            }
        } catch (SQLException | ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }

Помогите пожалуйста понять в чем ошибка и вытащить значение из BLOB.
  • Вопрос задан
  • 343 просмотра
Подписаться 2 Оценить 2 комментария
Решения вопроса 1
EugeneP2
@EugeneP2
Java Dev
Вот рабочий пример. Одно только условие, класс CabinetSquad должен наследовать Serializable интерфейс.

List<CabinetSquad> list = new ArrayList<CabinetSquad>(Arrays.asList(

		new CabinetSquad("a", 1), new CabinetSquad("b", 2), new CabinetSquad("c", 3)

		));

		ByteArrayOutputStream bout = new ByteArrayOutputStream();

		ObjectOutputStream ooStream = new ObjectOutputStream(bout);
		try {
			ooStream.writeObject(list);
		} finally {
			try {
				ooStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		byte[] byteArray = bout.toByteArray();

		// ----------------------------------

		Connection con = dataSource.getConnection();
		try {

			Statement s = con.createStatement();
			s.executeUpdate("CREATE TABLE ARRAY_LIST (id int not null primary key, list blob not null)");
			s.close();

			// -----------------------------

			PreparedStatement p = con.prepareStatement("INSERT INTO ARRAY_LIST VALUES (?,?)");
			p.setInt(1, 1);
			p.setBlob(2, new ByteArrayInputStream(byteArray));
			p.executeUpdate();
			p.close();

			// ------------------------------------------------

			PreparedStatement p2 = con.prepareStatement("SELECT list FROM ARRAY_LIST WHERE id = ?");

			p2.setInt(1, 1);

			ResultSet rs = p2.executeQuery();

			if (rs.next()) {

				Blob blob = rs.getBlob("list");

				ObjectInputStream objectInputStream = new ObjectInputStream(blob.getBinaryStream());
				try {

					List<CabinetSquad> recoverList = (List<CabinetSquad>) objectInputStream.readObject();

					for (CabinetSquad sc : recoverList) {
						System.out.println(sc);
					}

				} finally {
					try {
						objectInputStream.close();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}

			}

			rs.close();
			p2.close();

		} finally {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
19 дек. 2024, в 02:11
15000 руб./за проект
19 дек. 2024, в 02:09
11000 руб./за проект
19 дек. 2024, в 00:46
30000 руб./за проект