powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сериализация байт массивов (byte[])
2 сообщений из 2, страница 1 из 1
Сериализация байт массивов (byte[])
    #38358228
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Помогите разобраться с сериализацией байт массивов.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
public class VkCursor extends AbstractWindowedCursor implements Serializable {
	private static final long serialVersionUID = 1L;
	protected CursorWindow mWindow;
	protected int mPos;
	private int mCount = NO_COUNT;

......

	private void writeObject(ObjectOutputStream stream) throws IOException {
		stream.writeLong(serialVersionUID);
    		if (mWindow!=null)
	        try {
	        	mWindow.acquireReference();

	        	int startPosition = mWindow.getStartPosition();
	        	stream.writeInt(startPosition);
	        	int numRows = mWindow.getNumRows();
	        	stream.writeInt(numRows);
	        	stream.writeInt(mPos);
	        	stream.writeInt(mCount);

	        	for(int pos=startPosition; pos<numRows; pos++) {
	        		// write _id
	       			long _id = mWindow.getLong(pos, 0);
	        		stream.writeLong(_id);
	        		// write Object  
	        		byte[] bs = mWindow.getBlob(pos, 1);
	        		int length = bs.length;
	        		stream.writeInt(length);
	        		stream.write(bs, 0, length);
	        	}
	        } finally {
	        	mWindow.releaseReference();
	        }
	}
    

	private void readObject(ObjectInputStream stream) throws Exception { 
    		final long version = stream.readLong();
	    	if (version==1L) {
            		if (mWindow == null) {
                		mWindow = new CursorWindow(true);
		        } else {
                		mCursorState++;
                		queryThreadLock();
	                	try {
        	        		mWindow.clear();
                		} finally {
                			queryThreadUnlock();
	                	}
        	    	}
			try {
		            	mWindow.acquireReference();
            	
            			int startPos = stream.readInt();
		            	mWindow.setStartPosition(startPos);
	        		int numRows = stream.readInt();
	        		mPos = stream.readInt();
		        	mCount = stream.readInt();

		        	mWindow.setNumColumns(2);
	        		for(int pos=startPos; pos<numRows; pos++) {
	        			boolean alloc = mWindow.allocRow();
			       		if (!alloc) {
	       				    	throw new Exception(String.format("Failed allocating fieldDir at startPos %d row %d", startPos, numRows));
			       		}
	       				// read _id
			       		long _id = stream.readLong();
	       				mWindow.putLong(_id, pos, 0);
			       		// read Object
	        			int length = stream.readInt();
		        		byte[] bs = new byte[length];
		                	stream.read(bs, 0, length);
	        	        	mWindow.putBlob(bs, pos, 1);
	        		}        	
            	
		        } finally {
		        	mWindow.releaseReference();
	        	}
		} 	
	}
}



Ошибка происходит при чтении в цикле for(int pos=startPos; pos<numRows; pos++)
Первый проход проходи правильно, а на втором проходе long _id = бредовое значение

Я предполагаю, что я не правильно записываю/или читаю blob(byte[]) поля:

Запись:
Код: java
1.
2.
3.
4.
       		byte[] bs = mWindow.getBlob(pos, 1);
        	int length = bs.length;
        	stream.writeInt(length);
        	stream.write(bs, 0, length);


Чтение:
Код: javascript
1.
2.
3.
4.
        	int length = stream.readInt();
	      	byte[] bs = new byte[length];
	        stream.read(bs, 0, length);
	        mWindow.putBlob(bs, pos, 1);

P.S. Специально проверил длину байт массива после сохранения и при восстановлении – они одинаковы :(
...
Рейтинг: 0 / 0
Сериализация байт массивов (byte[])
    #38358397
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ найден:

Код: java
1.
2.
3.
4.
5.
// read Object
int length = stream.readInt();
byte[] bs = new byte[length];
stream.readFully(bs, 0, length); // Вместо stream.read(bs, 0, length)
mWindow.putBlob(bs, pos, 1);
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сериализация байт массивов (byte[])
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]