বাইট অ্যারেতে জাভা সিরিয়ালাইজেবল অবজেক্ট


292

ধরা যাক আমার একটি সিরিয়ালযোগ্য ক্লাস আছে AppMessage

আমি এটি byte[]সকেট হিসাবে অন্য মেশিনে স্থানান্তর করতে চাই যেখানে এটি প্রাপ্ত বাইটগুলি থেকে পুনরায় তৈরি করা হয় ilt

আমি কীভাবে এটি অর্জন করতে পারি?


5
কেন byte[]? কেন এটি কেবল সকেটে দিয়ে সরাসরি লিখবেন না ObjectOutputStream, এবং এটি দিয়ে পড়বেন ObjectInputStream?
লার্নের মারকুইস


1
new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
আসাদ শাকিল

উত্তর:


411

বাইট অ্যারে পাঠাতে প্রস্তুত করুন:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = null;
try {
  out = new ObjectOutputStream(bos);   
  out.writeObject(yourObject);
  out.flush();
  byte[] yourBytes = bos.toByteArray();
  ...
} finally {
  try {
    bos.close();
  } catch (IOException ex) {
    // ignore close exception
  }
}

বাইট অ্যারে থেকে একটি অবজেক্ট তৈরি করুন:

ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;
try {
  in = new ObjectInputStream(bis);
  Object o = in.readObject(); 
  ...
} finally {
  try {
    if (in != null) {
      in.close();
    }
  } catch (IOException ex) {
    // ignore close exception
  }
}

48
আমি প্রশ্নটি পড়ি তা নয়। আমার কাছে মনে হচ্ছে তার সমস্যাটি হ'ল কীভাবে বস্তুটিকে বাইটে রূপান্তর করা যায় [] - কীভাবে এটি প্রেরণ করা যায় না।
টেলর লিজ

1
টেলর: হ্যাঁ আপনি এটা ঠিক আছে। আমি বস্তুকে একটি বাইটে পরিণত করতে চাই [] এবং এটি প্রেরণ করতে চাই। আপনি কি দয়া করে এই বাইটকে [কীভাবে কোনও বস্তুতে পরিণত করবেন সে সম্পর্কিত কোড সরবরাহ করতে পারেন?
আইটিইজি

সিস্টেম সংস্থানগুলি ছেড়ে দেওয়ার জন্য দয়া করে সর্বদা যে কোনও স্ট্রিমটি বন্ধ করুন। (কোডে সম্পাদিত)
লাকীমালাকা

এই বস্তুগুলির সাথে এটি কী কাজ করতে পারে যা আমি সিরিয়ালাইজযোগ্য বাস্তবায়ন করতে পারি না?
কেজেডাব্লু

2
ObjectInput, ObjectOuput, ByteArrayOutputStreamএবং ByteArrayInputStreamসব বাস্তবায়ন AutoCloseableইন্টারফেস, এটিকে ব্যবহারের হবে না ভাল অভ্যাস করতে ভুল করে তাদের বন্ধ অনুপস্থিত এড়াতে? (আমি সম্পূর্ণরূপে নিশ্চিত এই ভাল অভ্যাস নই, যে কেন আমি হতাশ করছি।) উদাহরণ: try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)){ /*Do stuff*/ }catch(IOException e){/*suppress exception*/}। এটি ক্লজটির প্রয়োজনীয়তা finalএবং এর অতিরিক্তটিও সরিয়ে দেয় try-catch
লুডভিগ রিডাহল

307

এটি করার সর্বোত্তম উপায় হ'ল SerializationUtilsঅ্যাপাচি কমন্স ল্যাং থেকে ব্যবহার করা ।

সিরিয়ালাইজ করতে:

byte[] data = SerializationUtils.serialize(yourObject);

Deserialize করতে:

YourObject yourObject = SerializationUtils.deserialize(data)

উল্লিখিত হিসাবে, এর জন্য কমন্স ল্যাং লাইব্রেরি প্রয়োজন। গ্রেডল ব্যবহার করে এটি আমদানি করা যায়:

compile 'org.apache.commons:commons-lang3:3.5'

ম্যাভেন:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.5</version>
</dependency>

জার ফাইল

এবং আরও উপায় এখানে উল্লিখিত

বিকল্পভাবে, পুরো সংগ্রহটি আমদানি করা যায়। পড়ুন এই লিঙ্কে


56
ওভারহেড যুক্ত? এই সময়ে চাকাটি আবারও তৈরি করতে পারে। সিরিয়াসলি, এই ওয়ান-লাইনার বোঝা এবং সম্ভাব্য ত্রুটিগুলি হ্রাস করা (যেমন সঠিক সময়ে স্ট্রিমটি বন্ধ না করা এবং কী নয়) এটি আরও অনেক সহজ।
ALOToverflow

2
সর্বোত্তম উপায়ে কারণ আপনি প্রস্তাবিত একটি সাধারণ লাইব্রেরি ব্যবহার করেন: 1) দৃust়তা: লোকেরা এটি ব্যবহার করছে এবং এইভাবে এটি কার্যকর হয়। 2) এটি উপরের (সর্বাধিক জনপ্রিয় উত্তর) কেবলমাত্র 1 টি লাইন দিয়ে তাই আপনার কোড পরিষ্কার থাকে। 3) কারণ ড্যান তাই বলেছিলেন। 4) আমি কেবল 3 :-) সম্পর্কিত মজা করছি
লরেন্স

2
দুর্ভাগ্যক্রমে, পদ্ধতিটি আউটপুট আকারকে 1024-তে সীমাবদ্ধ করে one
অবিলাশ

আমি এটিকে মাইক্রোসার্ভেসিসের জন্য পছন্দ করব না। লাইব্রেরি তাদের সরাসরি আকারের চেয়ে ভারী ভারী করে তুলতে পারে।
জোন

89

আপনি যদি জাভা> = 7 ব্যবহার করেন তবে আপনি সংস্থানসমূহ ব্যবহার করে গৃহীত সমাধানটি উন্নত করতে পারেন :

private byte[] convertToBytes(Object object) throws IOException {
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutput out = new ObjectOutputStream(bos)) {
        out.writeObject(object);
        return bos.toByteArray();
    } 
}

এবং অন্যান্য উপায়ে:

private Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException {
    try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
         ObjectInput in = new ObjectInputStream(bis)) {
        return in.readObject();
    } 
}

7

সিরিয়ালাইজেশন ব্যবহার করে করা যেতে পারে বাইট রূপান্তর বস্তু ApacheUtils দ্বারা, ধারাবাহিকভাবে & deserialize পদ্ধতি দ্বারা [] এবং ভাইস বিপরীতভাবে, যেমন @uris উত্তরে বলেন।

সিরিয়ালাইজেশন করে কোনও বস্তুকে বাইট [] এ রূপান্তর করতে:

byte[] data = SerializationUtils.serialize(object);

বাইট []] ডিজেআরিয়ালাইজেশন করে অবজেক্টে রূপান্তর করা ::

Object object = (Object) SerializationUtils.deserialize(byte[] data)

Org-apache-Commons-lang.jar ডাউনলোড করার লিঙ্কটিতে ক্লিক করুন

ক্লিক করে .ar ফাইল একীভূত করুন:

ফাইলের নাম -> ওপেন Medule সেটিংস -> আপনার মডিউল নির্বাচন করুন -> অধীনস্থ -> যোগ জার ফাইল এবং আপনার কাজ সম্পন্ন করা হয়।

আশা করি এটি সাহায্য করবে


3
কখনই এর মতো নির্ভরতা যুক্ত করবেন না, নির্ভরতা ডাউনলোড করার জন্য মাভেন / গ্রেডেল ব্যবহার করুন এবং এটি নির্মাণের পথে যুক্ত করুন
ড্যানিয়েল বো

4

আমি সিরিয়ালাইজেশন সরঞ্জামগুলি ব্যবহার করার পরামর্শ দিই। আমি @ অবিলাশের একটি ভুল মন্তব্যে একটি পরিবর্তন করতে চাই। SerializationUtils.serialize()পদ্ধতি না 1024 বাইট, অন্য উত্তর এখানে বিপরীত অবধি সীমিত।

public static byte[] serialize(Object object) {
    if (object == null) {
        return null;
    }
    ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
    try {
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
        oos.flush();
    }
    catch (IOException ex) {
        throw new IllegalArgumentException("Failed to serialize object of type: " + object.getClass(), ex);
    }
    return baos.toByteArray();
}

প্রথম দর্শনে - আপনি ভাবতে পারেন যে new ByteArrayOutputStream(1024)এটি কেবল একটি নির্দিষ্ট আকারের অনুমতি দেবে। তবে আপনি যদি ঘুরে দেখেন ByteArrayOutputStreamতবে প্রয়োজনীয় স্ট্রিমটি প্রবাহিত হয়ে উঠবে তা বুঝতে পারবেন:

এই শ্রেণিটি একটি আউটপুট স্ট্রিম প্রয়োগ করে যেখানে ডেটা বাইট অ্যারেতে লেখা হয়। এতে ডেটা লিখিত হওয়ার সাথে সাথে বাফার স্বয়ংক্রিয়ভাবে বেড়ে যায়। toByteArray()এবং ব্যবহার করে ডেটা পুনরুদ্ধার করা যেতে পারে toString()


আপনি কি বিপরীত করতে পারেন? তাই বাইট [] আপত্তি? আমি জানি অন্যদের কাছে এটি রয়েছে তবে আমি আপনার উত্তরটি অনেক বেশি পছন্দ করি এবং আমি কাজটি নিষ্ক্রিয় করতে পারি না। আমি কোনও অবস্থাতেই নালার দিকে ফিরে এড়াতে চাই।
টোবিয়াস কলব

1

আমি এটিকে সকেটের উপর দিয়ে অন্য কোনও মেশিনে বাইট হিসাবে প্রেরণ করতে চাই

// When you connect
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
// When you want to send it
oos.writeObject(appMessage);

এটি প্রাপ্ত বাইটগুলি থেকে এটি পুনর্নির্মাণ করা হয়।

// When you connect
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
// When you want to receive it
AppMessage appMessage = (AppMessage)ois.readObject();

1

আরও একটি আকর্ষণীয় পদ্ধতি হ'ল com.fasterxml.jackson.databind.ObjectMapper

byte[] data = new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)

মাভেন নির্ভরতা

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

1

স্প্রিং ফ্রেমওয়ার্ক org.springframework.util.SerializationUtils

byte[] data = SerializationUtils.serialize(obj);

1

আপনি যদি বসন্ত ব্যবহার করে থাকেন তবে স্প্রিং-কোরে একটি ব্যবহার শ্রেণি রয়েছে। আপনি সহজভাবে করতে পারেন

import org.springframework.util.SerializationUtils;

byte[] bytes = SerializationUtils.serialize(anyObject);
Object object = SerializationUtils.deserialize(bytes);

0

জাভা 8+ সহ কোড উদাহরণ:

public class Person implements Serializable {

private String lastName;
private String firstName;

public Person() {
}

public Person(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getFirstName() {
    return firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

@Override
public String toString() {
    return "firstName: " + firstName + ", lastName: " + lastName;
}
}


public interface PersonMarshaller {
default Person fromStream(InputStream inputStream) {
    try (ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) {
        Person person= (Person) objectInputStream.readObject();
        return person;
    } catch (IOException | ClassNotFoundException e) {
        System.err.println(e.getMessage());
        return null;
    }
}

default OutputStream toStream(Person person) {
    try (OutputStream outputStream = new ByteArrayOutputStream()) {
        ObjectOutput objectOutput = new ObjectOutputStream(outputStream);
        objectOutput.writeObject(person);
        objectOutput.flush();
        return outputStream;
    } catch (IOException e) {
        System.err.println(e.getMessage());
        return null;
    }

}

}

0

আপনি যদি কোনও সুন্দর নির্ভরতা অনুলিপি করতে চান তবে অনুলিপি করুন copy নীচের কোডটি ধরুন।

উদাহরণ

MyObject myObject = ...

byte[] bytes = SerializeUtils.serialize(myObject);
myObject = SerializeUtils.deserialize(bytes);

সূত্র

import java.io.*;

public class SerializeUtils {

    public static byte[] serialize(Serializable value) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        try(ObjectOutputStream outputStream = new ObjectOutputStream(out)) {
            outputStream.writeObject(value);
        }

        return out.toByteArray();
    }

    public static <T extends Serializable> T deserialize(byte[] data) throws IOException, ClassNotFoundException {
        try(ByteArrayInputStream bis = new ByteArrayInputStream(data)) {
            //noinspection unchecked
            return (T) new ObjectInputStream(bis).readObject();
        }
    }
}

0

কেউ যদি উত্পাদনে এটি ব্যবহার করতে চায় তবে এটি গ্রহণযোগ্য উত্তরের কেবলমাত্র একটি অনুকূলিত কোড কোড:

    public static void byteArrayOps() throws IOException, ClassNotFoundException{

    String str="123";
     byte[] yourBytes = null;

    // Convert to byte[]

    try(ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream out =  new ObjectOutputStream(bos);) {


      out.writeObject(str);
      out.flush();
      yourBytes = bos.toByteArray();

    } finally {

    }

    // convert back to Object

    try(ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
            ObjectInput in = new ObjectInputStream(bis);) {

      Object o = in.readObject(); 

    } finally {

    }




}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.