ProgramingTip

자바에서 생성 화 필요

bestdevel 2021. 1. 8. 23:06
반응형

자바에서 생성 화 필요


누구든지 Java에서 서술 화의 어느 하나라고 설명하는 예제 시나리오를 말해 줄 수 있습니까? 나는 정의가 필요하지 않습니다.


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

이제 문제는 네트워크 인프라이고 하드 디스크는 JAVA 개체가 아닌 비트와 바이트를 이해하는 하드웨어 구성 요소입니다.

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

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


일련 화에 대한 짧은 이야기

수년간의 노력 끝에 지구의 과학자들은 일상 업무에서 지원 수있는 로봇을 개발했습니다. 그러나이 로봇은 화성의 과학자들이 개발 한 로봇보다 기능이 적습니다.

두 행성의 과학자들이 만난 후 화성은 로봇을 지구로 보내기로 결정했습니다. 그러나 문제가 발생했습니다. 로봇 100 대를 배치하는 데 비용은 1 억 지구 달러였습니다. 그리고 여행하는 데 약 60 일이 전시되어 있습니다.

마지막으로 Mar의 과학자들은 비밀을 지구의 과학자들과 공유하기로 결정했습니다. 이 비밀은 클래스 / 로봇의 구조에 관한 것이 었습니다. 지구의 과학자들은 지구 자체에서 동일한 구조를 개발했습니다. Mar의 과학자들은 각 로봇의 데이터를 내장 화 하여 지구로 보라고합니다. 지구의 과학자들은 데이터를 역 각화 하여 그에 따라 로봇에 공급했습니다.

이 프로세스를 통해 엄청난 양의 데이터를 전달하는 시간을 절약 할 수 있습니다.

일부 로봇은 화성에서 일부 방어 작업에 사용되었습니다. 그래서 과학자들은 데이터를 지구로 보내기 전에 그 로봇의 가지 중요한 속성을 일시적인 표시했습니다 . 임시 속성은 배열가 역화 될 때 null (참조의 경우) 또는 배열 (기본 유형의 경우)로 설정됩니다.

지구의 과학자들이 주목 한 또 하나의 점은 화성의 과학자들이 환경에 대한 세부 사항을 유지 하기 위해 몇 가지 정적 변수생성하도록 요청했다는 것입니다. 다만 세부 정보는 일부 로봇에서 사용됩니다. 그러나 화성의 과학자들은 세부 사항을 공유하지 않습니다. 지구의 환경은 화성의 환경과 달랐기 때문입니다.

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

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

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

최신 정보

그렇게하는 것이 도움으로 실제 우주선 대신 신호를 사용하여 데이터를 보낼 수있게 많은 양의 데이터를 제공하는 것이 여전히 어려운 일임을 깨달았습니다. 어느 정도의 프로세스를 더 빠르게 만들지 만 여전히 느립니다. 따라서 다른 과학자들은 데이터 크기를 위해 다른 아이디어를 내놓았습니다. 일부 과학자들은 데이터 압축을 제안하여 일부 과학자들은 데이터를 역내 화 할 수있는 일부 제안을 사용하여 데이터를 표현할 제안 제안했습니다. 아이디어 중 일부는 XML , JSON , msgpack , निम्न (Nimn)입니다.


자바 직렬화 (특히 직렬화 가능Exernalizable 인터페이스)를 사용하면 임의의 복잡한 자바 객체를 디스크에서 /로 또는 네트워크에서 자동 또는 수동으로 읽고 쓸 수 있습니다 . XML과 JSON은 텍스트 형식이지만 Java는 이진 형식입니다. (직렬화는 데이터 읽기 / 쓰기의 개념이지만, 질문은 Java에 관한 것 완료 화 가능 / Exernalizable과 같은 내장 화 시스템을 참조 가정합니다.)

XML / JSON보다 "직렬화 가능 구현"의 장점
처음에는 거의 무료로 화를 얻을 수 있습니다. 사용 가능한 제품을 사용합니다. 또 다른 장점은 기본 형식이기 때문에 텍스트 형식보다 훨씬 더 간결하고 공간을 적게 사용하는 것입니다. (네트워크를 절약하는 디스크의 저장 공간을 절약하는 데 유용함)

단점 XML / JSON을 통해 "직렬화 가능"구현
내장 자바는 서로 다른 합성 화 형식을 호환 만드는 것이 큰 악몽이 될 수 있습니다. 또한 XML 및 JSON을 수동으로 편집 할 수 없습니다. 같은 XML과 JSON은 사람이 읽을 수 있기 때문에 바이너리 형식보다 XML과 JSON을 숙달하는 것이 더 있습니다. Java의 내장 된 구성 화의 또 다른 단점은 다른 프로그래밍 언어의 데이터를 (쉽게) 일련 화 / 역화 할 수있는 것입니다.

데이터 읽기 / 쓰기를위한 대체 기술
두 가지 장점을 모두 제공하는 Java의 내장 화 이외의 대체 화 기술이 있습니다. 압축 바이너리 형식, 언어 상호 운용, 버전 쉽게 만드는 용이성, 쉽게 만드는 도구 등이 있습니다. 읽을 수있는 형식의 이진 데이터. 예를 들어 Google의 오픈 소스 프로토콜MessagePack 압축 이진 데이터를 읽고 쓸 수 있고 버전을 쉽게 만들 수있는 화 라이브러리 / 형식의 예입니다. 내장 된 자바 내장 화에 비해 라이브러리의 가장 큰 단점은 있다는 것화를 위해 위해 평범한 이전 데이터를 포함한다는 것입니다 (관련 동작이있는 것보다 완전한 기능을 Java 객체와 반대). 그러나이 단점은 실제로 정보가 저장되는 데이터 모델을 래핑하거나 저장되는 데이터 모델로부터 분리되는 것이 좋은 프로그래밍 관행이며 여러 가지를 더 쉽게 지원할 수 있습니다.

요구
사항을 요구하는 것이 많은 요구 사항을 요구합니다.

  1. 나중에 사용할 수 있도록 데이터를 저장하기 만하면됩니다. 예를 들어 비디오 게임을 작성 가정 해 보겠습니다. 프로그램이 영원히 실행되지는 않습니다. 크래시가 발생하지 않는 것도 있고 (아마도 싫다) 사용자가 어느 시점에서 프로그램을 종료하고 운영하는 것이 리소스를 절약하기 때문에 프로그램을 종료 할 수 있습니다 (예 : Android에서 사용자가 상호 작용하지 않는 프로세스가 자주 발생합니다. RAM과 같은 시스템 리소스를하기 위해 OS에 의도적으로 종료 됨). 사용자가 처음부터 시작하지 않고 원래 위치 또는 가장 최근의 저장 지점에서 다시 시작할 수 있도록하기 위해 게임 상태를 영구 저장소 (예 : 하드 드라이브, 사용자의 Google 드라이브 계정 등)로 지정합니다. 이렇게 비용

  2. 원격 서버에서 정보 검색. 게임 예제를 계속해 보겠습니다. 온라인 멀티 플레이어 게임을 만들거나 사용자가 앱을 업데이트하지 게임에 새로운 레벨이나 아이템을 제공 할 수 있도록하고 싶다고 가정 해 보겠습니다. 이렇게 비용이 많이 드는 온라인 플레이어에 대한 정보 또는 새 레벨 / 아이템에 대한 정보가 컴퓨터에서 전달되기를 원할 것입니다 (서버에서 전달되기위한 모든 앱 사본에 대한 연락처로 사용). 앱의 사본 식별에. 서버와 앱 모두 다음 데이터 구조 (예 : 다른 플레이어의 위치, 새 레벨의 구조, 새 레벨에 대한 설명 / 이미지 등)에 대한 정보 메모리 내 표현이 필요하지만 전송 항목 서버에서 기기 앱으로

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


전달의 상태를 파일에 저장하거나 네트워크를 통해 보내려면 전달의 바이트로 변환해야합니다. 보내 주시기 바랍니다.

Java에는 기본 제공되는 것이 있고 다른 옵션에는 XML 또는 JSON이 포함됩니다.

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


  • 디스크에 저장 (구조)을 저장해야합니다.
  • 웹 서비스는 수업을 전송하기 전에 xml로 작성해야합니다.

또한 생성 화를 사용하여 객체 복제를 구현할 수도 있습니다.


어디에서 처리 할 것인지 지정하는 비트로의 객체 변환이라고합니다. Java는 주로 웹 기반 앱을 의미하기 때문에 Java에서 필수적인 것입니다. 데이터를 네트워크에서 사용할 수 있도록 만드는 것을 의미합니다.


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;
    }
}

참조 URL : https://stackoverflow.com/questions/2475448/need-of-serialization-in-java

반응형