ByteArrayOutputStream bos =newByteArrayOutputStream();ObjectOutputStream out =null;try{
out =newObjectOutputStream(bos);
out.writeObject(yourObject);
out.flush();byte[] yourBytes = bos.toByteArray();...}finally{try{
bos.close();}catch(IOException ex){// ignore close exception}}
Utwórz obiekt z tablicy bajtów:
ByteArrayInputStream bis =newByteArrayInputStream(yourBytes);ObjectInput in =null;try{
in =newObjectInputStream(bis);Object o = in.readObject();...}finally{try{if(in !=null){
in.close();}}catch(IOException ex){// ignore close exception}}
ObjectInput, ObjectOuput, ByteArrayOutputStreamI ByteArrayInputStreamwszystko zaimplementować AutoCloseableinterfejs, czy nie byłoby dobrą praktyką jest stosowanie go, aby uniknąć brakuje zamykając je przez pomyłkę? (Nie jestem do końca pewien, czy to jest najlepsza praktyka, dlatego zastanawiam.) Przykład: try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)){ /*Do stuff*/ }catch(IOException e){/*suppress exception*/}. Eliminuje to również potrzebę finalklauzuli i jej dodatkowych try-catch.
Dodano koszty ogólne? W tym momencie można również odbudować koło. Poważnie, o wiele łatwiej jest zrozumieć ten jeden wiersz i zmniejszyć możliwe błędy (takie jak nie zamykanie strumienia we właściwym czasie i tak dalej).
Najlepszy sposób, ponieważ korzystasz ze wspólnej biblioteki oferującej ci: 1) Wytrzymałość: ludzie korzystają z tego, a zatem jest zatwierdzony do pracy. 2) Robi powyższe (najpopularniejsza odpowiedź) z tylko 1 linią, dzięki czemu kod pozostaje czysty. 3) Ponieważ Dan tak powiedział. 4) Żartuję, jeśli chodzi o 3 :-)
Jeśli używasz Java> = 7, możesz ulepszyć zaakceptowane rozwiązanie, używając try z zasobami :
privatebyte[] convertToBytes(Object object)throwsIOException{try(ByteArrayOutputStream bos =newByteArrayOutputStream();ObjectOutput out =newObjectOutputStream(bos)){
out.writeObject(object);return bos.toByteArray();}}
I odwrotnie:
privateObject convertFromBytes(byte[] bytes)throwsIOException,ClassNotFoundException{try(ByteArrayInputStream bis =newByteArrayInputStream(bytes);ObjectInput in =newObjectInputStream(bis)){return in.readObject();}}
Można to zrobić za pomocą SerializationUtils , serializacji i deserializacji przez ApacheUtils w celu konwersji obiektu na bajt [] i odwrotnie, jak podano w odpowiedzi @uris.
Aby przekonwertować obiekt na bajt [] poprzez serializację:
byte[] data =SerializationUtils.serialize(object);
Aby przekonwertować bajt [] na obiekt przez deserializację:
Polecam również użyć narzędzia SerializationUtils. Chcę zarabiać na złym komentarzu @Abilash. SerializationUtils.serialize()Metoda jest nie ograniczony do 1024 bajtów, w przeciwieństwie do innej odpowiedzi tutaj.
publicstaticbyte[] serialize(Object object){if(object ==null){returnnull;}ByteArrayOutputStream baos =newByteArrayOutputStream(1024);try{ObjectOutputStream oos =newObjectOutputStream(baos);
oos.writeObject(object);
oos.flush();}catch(IOException ex){thrownewIllegalArgumentException("Failed to serialize object of type: "+ object.getClass(), ex);}return baos.toByteArray();}
Na pierwszy rzut oka możesz pomyśleć, że new ByteArrayOutputStream(1024)pozwoli to tylko na ustalony rozmiar. Ale jeśli przyjrzysz się uważnie ByteArrayOutputStream, zorientujesz się, że strumień wzrośnie, jeśli to konieczne:
Ta klasa implementuje strumień wyjściowy, w którym dane są zapisywane w tablicy bajtów. Bufor rośnie automatycznie, gdy dane są do niego zapisywane. Dane można odzyskać za pomocą toByteArray()i
toString().
czy możesz dodać, jak zrobić odwrotnie? więc bajt [] do sprzeciwu? Wiem, że inni to mają, ale bardziej podoba mi się twoja odpowiedź i nie mogę uruchomić deserializacji. W każdym razie chcę uniknąć zwracania wartości null.
Chciałbym przesłać jako bajt [] przez gniazda do innej maszyny
// When you connectObjectOutputStream oos =newObjectOutputStream(socket.getOutputStream());// When you want to send it
oos.writeObject(appMessage);
gdzie jest przebudowywany z odebranych bajtów.
// When you connectObjectInputStream ois =newObjectInputStream(socket.getInputStream());// When you want to receive itAppMessage appMessage =(AppMessage)ois.readObject();
To tylko zoptymalizowana forma kodu akceptowanej odpowiedzi na wypadek, gdyby ktoś chciał użyć jej w środowisku produkcyjnym:
publicstaticvoid byteArrayOps()throwsIOException,ClassNotFoundException{String str="123";byte[] yourBytes =null;// Convert to byte[]try(ByteArrayOutputStream bos =newByteArrayOutputStream();ObjectOutputStream out =newObjectOutputStream(bos);){
out.writeObject(str);
out.flush();
yourBytes = bos.toByteArray();}finally{}// convert back to Objecttry(ByteArrayInputStream bis =newByteArrayInputStream(yourBytes);ObjectInput in =newObjectInputStream(bis);){Object o = in.readObject();}finally{}}
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.
byte[]
? Dlaczego po prostu nie napisać go bezpośrednio do gniazdaObjectOutputStream
i czytać za pomocąObjectInputStream
?