Powiedzmy, że mam klasę możliwą do serializacji AppMessage
.
Chciałbym przesłać go byte[]
przez gniazda do innej maszyny, gdzie jest on przebudowywany z odebranych bajtów.
Jak mogłem to osiągnąć?
java
object
serialization
iTEgg
źródło
źródło
byte[]
? Dlaczego po prostu nie napisać go bezpośrednio do gniazdaObjectOutputStream
i czytać za pomocąObjectInputStream
?new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Odpowiedzi:
Przygotuj tablicę bajtów do wysłania:
Utwórz obiekt z tablicy bajtów:
źródło
ObjectInput
,ObjectOuput
,ByteArrayOutputStream
IByteArrayInputStream
wszystko zaimplementowaćAutoCloseable
interfejs, 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ęfinal
klauzuli i jej dodatkowychtry-catch
.Najlepszym sposobem na to jest użycie
SerializationUtils
z Apache Commons Lang .Aby serializować:
Aby dokonać deserializacji:
Jak wspomniano, wymaga to biblioteki Commons Lang. Można go zaimportować za pomocą Gradle:
Maven:
Plik jar
I więcej sposobów wymienionych tutaj
Alternatywnie można zaimportować całą kolekcję. Zobacz ten link
źródło
Jeśli używasz Java> = 7, możesz ulepszyć zaakceptowane rozwiązanie, używając try z zasobami :
I odwrotnie:
źródło
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ę:
Aby przekonwertować bajt [] na obiekt przez deserializację:
Kliknij link, aby pobrać org-apache-commons-lang.jar
Zintegruj plik .jar, klikając:
FileName -> Otwórz Ustawienia Medule -> Wybierz moduł -> Zależności -> Dodaj plik Jar i gotowe.
Mam nadzieję, że to pomaga .
źródło
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.Na pierwszy rzut oka możesz pomyśleć, że
new ByteArrayOutputStream(1024)
pozwoli to tylko na ustalony rozmiar. Ale jeśli przyjrzysz się uważnieByteArrayOutputStream
, zorientujesz się, że strumień wzrośnie, jeśli to konieczne:źródło
źródło
Kolejna interesująca metoda pochodzi z
com.fasterxml.jackson.databind.ObjectMapper
byte[] data = new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Zależność Maven
źródło
Spring Framework
org.springframework.util.SerializationUtils
źródło
Jeśli używasz sprężyny, dostępna jest klasa utylizacji w rdzeniu sprężynowym. Możesz po prostu zrobić
źródło
przykład kodu z java 8+:
źródło
Jeśli chcesz miłego rozwiązania bez kopiowania i wklejania. Złap poniższy kod.
Przykład
Źródło
źródło
To tylko zoptymalizowana forma kodu akceptowanej odpowiedzi na wypadek, gdyby ktoś chciał użyć jej w środowisku produkcyjnym:
źródło