programing

자바에서 객체의 직렬화의 필요성은 무엇입니까?

closeapi 2023. 9. 13. 22:38
반응형

자바에서 객체의 직렬화의 필요성은 무엇입니까?

자바에서 객체 직렬화의 필요성이 무엇인지 알려주고 필요성을 설명할 수 있는 예시 시나리오를 줄 수 있는 사람?(시리얼라이제이션이 무엇인지는 이미 잘 알고 있습니다. 언제 사용하고 어떻게 사용하는지만 알고 싶습니다.)

직렬화에 관한 단편소설

수년간의 노력 끝에, 지구의 과학자들은 일상 생활에서 그들을 도울 수 있는 로봇을 개발했습니다.하지만 이 로봇은 화성에서 과학자들이 개발한 로봇들보다 기능이 적었습니다.

두 행성의 과학자들 사이의 만남 이후, 화성이 그들의 로봇들을 지구로 보내기로 결정되었습니다.그런데 문제가 발생했습니다.100대의 로봇을 지구로 보내는 데 드는 비용은 1억 달러였습니다.그리고 60일 정도의 여행이 필요합니다.

마침내, 화성의 과학자들은 그들의 비밀을 지구의 과학자들과 공유하기로 결정했습니다.이 비밀은 학급/로봇의 구조에 관한 것이었습니다.지구의 과학자들은 지구에서 똑같은 구조물을 개발했습니다.화성의 과학자들은 각각의 로봇의 데이터를 연속해서 지구로 보냈습니다.지구의 과학자들은 그 데이터를 역직렬화시켜서 그에 따라 각각의 로봇에 공급했습니다.

이 과정을 통해 방대한 양의 데이터를 전달하는 데 시간을 절약할 수 있었습니다.

그 로봇들 중 일부는 화성에서의 방어 작업에 사용되고 있었습니다.그래서 그들의 과학자들은 그들의 데이터를 지구로 보내기 전에 그 로봇들의 몇몇 중요한 특성들을 일시적인 으로 표시했습니다.객체가 역직렬화될 때 과도 속성은 null(참조의 경우) 또는 기본값(primitive type의 경우)으로 설정됩니다.

지구 과학자들이 주목한 또 하나의 점은 화성의 과학자들이 환경에 대한 세부 사항을 유지하기 위해 정적인 변수들을 만들어 달라고 요청했다는 것입니다.이러한 세부사항들은 일부 로봇들에 의해 사용됩니다.하지만 화성의 과학자들은 이러한 세부사항들을 공유하지 않습니다.왜냐하면 지구의 환경은 화성의 환경과 달랐기 때문입니다.

로봇 클래스 구조에 대해 알고 있고 직렬화된 데이터를 가지고 있음에도 불구하고 지구의 과학자는 로봇을 작동시킬 수 있는 데이터를 역직렬화 할 수 없었습니다.

Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:

화성의 과학자들은 완전한 지불을 기다리고 있었습니다.지불이 완료되자 화성의 과학자들은 그 연쇄 버전을 공유했습니다.지구 과학자들과 함께 UID.지구의 과학자들은 로봇 수업으로 설정했고 모든 것이 작동하기 시작했습니다.

갱신하다

비록 직렬화의 도움으로 그들은 실제 우주선 대신 신호를 사용하여 데이터를 보낼 수 있게 되었지만, 그들은 많은 양의 데이터를 보내는 것이 여전히 어려운 일이라는 것을 깨달았습니다.직렬화는 공정을 더 저렴하고 빠르게 만들지만 여전히 느렸습니다.그래서 서로 다른 과학자들은 데이터 크기를 줄이기 위한 다른 아이디어를 생각해 냈습니다.일부 과학자들은 데이터를 압축할 것을 제안했고 일부 과학자들은 데이터를 역직렬화할 수 있도록 다른 메커니즘을 사용하여 데이터를 표현할 것을 제안했습니다.아이디어로는 XML, JSON, msgpack, Nimn 등이 있습니다.

직렬화는 일반적으로 네트워크를 통해 데이터를 보내거나 파일에 저장해야 할 경우에 사용됩니다.데이터란 텍스트가 아닌 객체를 의미합니다.

문제는 네트워크 인프라스트럭처와 하드 디스크가 비트와 바이트는 이해하지만 자바 객체는 이해하지 못하는 하드웨어 구성 요소라는 점입니다.

직렬화는 Java 개체의 값/상태를 바이트로 변환하여 네트워크를 통해 보내거나 저장하는 것입니다.

이는 PSTN 전화선을 통해 음성이 전송되는 방식과 유사합니다.

Java 직렬화(특히 Serializable 인터페이스와 Serializable 인터페이스)를 사용하면 디스크 또는 네트워크에서 자동으로 또는 수동으로 복잡한 Java 객체를 읽고 쓸 수 있습니다.XML과 JSON이 텍스트 형식인 반면, Java 직렬화는 이진 형식입니다.직렬화는 단순히 데이터를 읽고 쓰는 일반적인 개념이기도 하지만, 자바에 대한 질문이기 때문에 내장된 직렬화 시스템, 즉, 당신이 말하는 것이라고 추측합니다.직렬화 가능/확장 가능)

XML/JSON에 " 가능한 구현"의 즉 "직렬 가능"의 이점
처음에는 거의 무료로 연재를 받을 수 있습니다.직렬화 메커니즘과 함께 작동하기 위해 개체를 많이 변경할 필요가 없습니다.또 다른 장점은 이진 형식이기 때문에 텍스트 형식보다 훨씬 더 압축적이기 때문에 네트워크 대역폭을 절약하거나 디스크의 스토리지 공간을 절약하는 데 유용한 공간을 더 적게 사용할 수 있다는 것입니다.

XML/JSON에 " 가능 단점 "직렬 가능"
Java 직렬화에 내장된 단점은 개체를 변경할 경우 서로 다른 직렬화 형식이 호환되도록 하는 것이 실제로 큰 악몽이 될 수 있다는 것입니다.또한 XML 및 JSON을 수동으로 편집할 수 있지만 직렬화된 Java 개체를 Java로 읽지 않고는 편집할 수 없습니다.같은 이유로 XML과 JSON은 사람이 읽을 수 있기 때문에 이진 형식보다 XML과 JSON을 디버깅하는 것이 더 쉬운 경우가 많습니다.Java의 내장 직렬화 메커니즘의 또 다른 단점은 다른 프로그래밍 언어의 데이터를 쉽게 직렬화/병렬화할 수 없다는 것입니다.

데이터 읽기/쓰기를 위한 대안적 기법
자바의 내장 직렬화 이외에도 두 가지 장점을 모두 제공하는 대체 직렬화 기술이 있습니다. 콤팩트한 이진 포맷, 언어 상호 작용, 쉬운 버전 호환성, 그리고 이진 데이터를 쉽게 읽을 수 있는 형식으로 덤프할 수 있는 디버깅 도구 등이 있습니다.예를 들어 Google의 오픈 소스 프로토콜 버퍼 및 MessagePack은 콤팩트한 이진 데이터를 읽고 쓸 수 있고 버전 호환성을 쉽게 유지할 수 있는 직렬화 라이브러리/포맷의 예입니다.Java 직렬화에 기반한 이러한 라이브러리의 가장 큰 단점은 직렬화를 위해 오래된 일반 데이터 개체를 포함한다는 것입니다(이 개체와 관련된 동작도 포함된 완전한 기능을 갖춘 Java 개체와는 달리).정보가 저장되는 데이터 모델을 랩핑하거나 이로부터 파생된 개체로부터 분리하는 것은 실제로 좋은 프로그래밍 방식이며 여러 형식을 지원하는 것을 쉽게 해주는 이점입니다.

.
정의뿐만 아니라 필요성을 요청하셨기 때문에 다양한 활용 사례가 있습니다.

  1. 나중에 사용하기 위해 데이터를 저장하기만 하면 됩니다.예를 들어, 여러분이 비디오 게임을 쓰고 있다고 가정해 보겠습니다.프로그램이 영원히 실행되지는 않을 것입니다. 프로그램이 충돌하지 않더라도(원하는 바로는) 사용자는 아마도 어느 시점에서 프로그램을 종료하거나 운영 체제가 리소스를 절약하기 위해 프로그램을 종료할 수 있습니다(예: Android).사용자가 상호 작용하지 않는 백그라운드 프로세스는 RAM과 같은 시스템 리소스를 회수하기 위해 OS에 의해 자주 그리고 의도적으로 삭제됩니다.사용자가 처음부터 시작하지 않고 사용자가 있던 곳이나 가장 최근 저장 지점에서 다시 시작할 수 있도록 하려면 영구 저장소(즉, 하드 드라이브, 사용자의 Google 드라이브 계정 등)에 게임의 상태를 기록해야 합니다.이렇게 하려면 게임의 상태를 나타내는 메모리의 데이터 구조를 디스크에 쓸 수 있는 원시 바이트(또는 데이터를 저장하는 시스템)로 변환해야 합니다.

  2. 원격 서버에서 정보를 검색하는 중입니다.게임 예시를 계속해서...온라인 멀티플레이어 게임을 만들거나 사용자가 앱을 업데이트하지 않고도 게임 내 새로운 레벨이나 아이템을 제공할 수 있도록 하고 싶다고 가정합니다.이렇게 하려면 온라인 플레이어에 대한 정보 또는 새로운 레벨/항목에 대한 정보를 서버 컴퓨터(다양한 장치에 설치된 앱의 모든 복사본에 대한 연락처로 사용)에서 앱의 개별 복사본으로 전달하기를 원할 것입니다.서버와 앱 모두 이러한 데이터 구조(예를 들어, 다른 플레이어의 위치, 새로운 레벨의 구조, 새로운 아이템에 대한 설명/이미지 등)에 대한 일종의 인메모리 표현이 필요하지만, 서버로부터 디바이스 상의 앱으로 정보를 전달하기 위해 통신 시스템은 원시 바이트로 구성되며,따라서 데이터를 원시 바이트로 변환하고 원시 바이트에서 의미 있는 인메모리 데이터 구조로 다시 변환하는 방법이 필요합니다.

두 개의 서로 다른 프로세스/앱 간 또는 앱과 일부 스토리지 시스템 간의 거의 모든 통신은 일종의 직렬화 메커니즘이 필요한 경우입니다.

개체의 상태를 파일로 저장하거나 네트워크를 통해 전송하려면 일련의 바이트로 변환해야 합니다.이를 직렬화라고 합니다.

Java에는 이를 위한 메커니즘이 내장되어 있으며, 다른 옵션으로는 XML 또는 JSON이 있습니다.

필요한 경우의 예:개체 캐싱, 원격 메서드 호출, 개체 그래프를 디스크에 저장합니다.

  • 개체(-구조)를 디스크에 저장하려면 직렬화가 필요합니다.
  • 웹 서비스를 사용하려면 개체를 xml로 직렬화해야 전송할 수 있습니다.

또한 직렬화를 사용하여 개체 복제를 구현할 수도 있습니다.

직렬화는 일반적으로 객체를 일련의 비트로 변환하는 것을 말합니다.자바는 주로 웹 기반 앱의 데이터를 네트워크를 통해 사용할 수 있도록 만드는 것을 의미하기 때문에 자바에서 필수적인 것입니다.

public class Serializer {

    public static void write(Object o, File f) throws IOException {
        f.delete();
        f.createNewFile();
        FileOutputStream fileOut = new FileOutputStream(f);
        ObjectOutputStream out = new ObjectOutputStream(fileOut);
        out.writeObject(o);
        out.close();
        fileOut.close();
    }

    public static Object read(File f) throws Exception{
        FileInputStream fileIn = new FileInputStream(f);
        ObjectInputStream in = new ObjectInputStream(fileIn);
        Object e = in.readObject();
        in.close();
        fileIn.close();
        return e;
    }

    public static byte[] toBytes(Object o) {
        byte[] bytes = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = null;
        try {
            out = new ObjectOutputStream(bos);
            out.writeObject(o);
            out.flush();
            bytes = bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bos.close();
            } catch (IOException ex) {
                // ignore close exception
            }
        }

        return bytes;
    }

    public static Object fromBytes(byte[] bytes) {
        Object o = null;
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        ObjectInput in = null;
        try {
            in = new ObjectInputStream(bis);
            o = in.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                // ignore close exception
            }
        }

        return o;
    }
}

한 클래스에서 다른 클래스로 데이터를 보내는 데 문제가 있을 때 직렬화가 필요합니다.다른 클래스가 다른 위치 또는 하드 디스크에 있는 경우(즉, Distributed Systems)

직렬화의 역방향 작동을 역직렬화(deserialization)라고 합니다.

String Class와 모든 래퍼 클래스는 기본적으로 직렬화 가능한 인터페이스를 구현합니다.

직렬화 가능한 인터페이스는 클래스에 직렬화 기능을 제공하는 마커 인터페이스이기도 합니다.따라서 네트워크를 통해 개체의 상태를 전송하려면 직렬화 가능한 인터페이스를 구현해야 합니다.

언급URL : https://stackoverflow.com/questions/2475448/what-is-the-need-of-serialization-of-objects-in-java

반응형