Serializable이 무슨 뜻입니까?
수업의 의미가 정확히 무엇입니까?Serializable
?? ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
시리얼라이제이션은, 예를 들면 디스크에 보존하기 위해서, 메모리에서 일련의 비트로 오브젝트를 보관 유지하는 것입니다.역직렬화는 반대입니다. 즉, 디스크에서 데이터를 읽어서 개체를 하이드레이트/생성합니다.
질문의 맥락에서 보면, 이 클래스가 클래스에 실장되어 있는 경우, 이 클래스는 다른 시리얼라이저에 의해서 자동적으로 시리얼화 및 시리얼화 해제될 수 있는 인터페이스입니다.
대부분의 사용자가 이미 답변을 드렸습니다만, 아이디어를 설명하기 위해 필요한 분들을 위해 예를 추가하겠습니다.
다음과 같은 클래스 담당자가 있다고 가정해 보겠습니다.
public class Person implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public String firstName;
public String lastName;
public int age;
public String address;
public void play() {
System.out.println(String.format(
"If I win, send me the trophy to this address: %s", address));
}
@Override
public String toString() {
return String.format(".....Person......\nFirst Name = %s\nLast Name = %s", firstName, lastName);
}
}
그런 다음 다음과 같은 개체를 만듭니다.
Person william = new Person();
william.firstName = "William";
william.lastName = "Kinaan";
william.age = 26;
william.address = "Lisbon, Portugal";
이 오브젝트는 여러 스트림에 시리얼화할 수 있습니다.두 개의 스트림에 대해 이 작업을 수행합니다.
표준 출력으로의 시리얼화:
public static void serializeToStandardOutput(Person person)
throws IOException {
OutputStream outStream = System.out;
ObjectOutputStream stdObjectOut = new ObjectOutputStream(outStream);
stdObjectOut.writeObject(person);
stdObjectOut.close();
outStream.close();
}
파일로의 시리얼화:
public static void serializeToFile(Person person) throws IOException {
OutputStream outStream = new FileOutputStream("person.ser");
ObjectOutputStream fileObjectOut = new ObjectOutputStream(outStream);
fileObjectOut.writeObject(person);
fileObjectOut.close();
outStream.close();
}
그 후, 다음과 같이 입력합니다.
파일에서 직렬화 해제:
public static void deserializeFromFile() throws IOException,
ClassNotFoundException {
InputStream inStream = new FileInputStream("person.ser");
ObjectInputStream fileObjectIn = new ObjectInputStream(inStream);
Person person = (Person) fileObjectIn.readObject();
System.out.println(person);
fileObjectIn.close();
inStream.close();
}
즉, 클래스의 인스턴스를 바이트 스트림(예를 들어 파일에 저장)으로 변환한 후 다시 클래스로 변환할 수 있습니다.이 새로고침은 프로그램의 다른 인스턴스 또는 다른 머신에서 발생할 수 있습니다.단, 시리얼라이제이션은 (모든 언어로) 모든 종류의 문제를 수반합니다.특히 시리얼라이제이션 가능한 오브젝트 내의 다른 오브젝트에 대한 참조가 있는 경우에는 더욱 그렇습니다.
시리얼라이제이션에 대한 자세한 설명은 다음과 같습니다(자신의 블로그).
시리얼화:
시리얼라이제이션은 오브젝트 상태가 일련의 바이트 형식으로 표현되어 저장되는 시리얼라이제이션 프로세스입니다.이것은 파일에 저장할 수 있습니다.파일에서 개체 상태를 읽고 복원하는 프로세스를 역직렬화라고 합니다.
시리얼라이제이션의 필요성
현대 건축에서는 항상 객체 상태를 저장한 후 검색해야 합니다.예를 들어, Hibernate에서 객체를 저장하려면 클래스를 Serialable로 만들어야 합니다.오브젝트 상태를 바이트 형식으로 저장하면 다른 시스템으로 전송하여 해당 상태를 읽고 클래스를 가져올 수 있습니다.개체 상태는 데이터베이스 또는 다른 jvm 또는 별도의 구성 요소에서 가져올 수 있습니다.Serialization을 사용하여 Object 상태를 가져올 수 있습니다.
코드 예 및 설명:
먼저 항목 클래스를 살펴보겠습니다.
public class Item implements Serializable{
/**
* This is the Serializable class
*/
private static final long serialVersionUID = 475918891428093041L;
private Long itemId;
private String itemName;
private transient Double itemCostPrice;
public Item(Long itemId, String itemName, Double itemCostPrice) {
super();
this.itemId = itemId;
this.itemName = itemName;
this.itemCostPrice = itemCostPrice;
}
public Long getItemId() {
return itemId;
}
@Override
public String toString() {
return "Item [itemId=" + itemId + ", itemName=" + itemName + ", itemCostPrice=" + itemCostPrice + "]";
}
public void setItemId(Long itemId) {
this.itemId = itemId;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public Double getItemCostPrice() {
return itemCostPrice;
}
public void setItemCostPrice(Double itemCostPrice) {
this.itemCostPrice = itemCostPrice;
}
}
위의 코드에서 Item 클래스는 Serializable을 구현하고 있음을 알 수 있습니다.
이것은 클래스를 시리얼화할 수 있는 인터페이스입니다.
이제 serialVersion이라는 변수를 볼 수 있습니다.UID는 Long 변수로 초기화됩니다.이 숫자는 클래스 상태와 클래스 속성을 기반으로 컴파일러에 의해 계산됩니다.jvm이 파일에서 개체 상태를 읽을 때 개체 상태를 식별하는 데 도움이 되는 숫자입니다.
이를 위해 Oracle 공식 문서를 참조할 수 있습니다.
시리얼라이제이션 런타임은 serialVersion이라고 불리는 버전 번호를 시리얼화 가능한 각 클래스에 관련짓습니다.UID: 시리얼화된 객체의 송신측과 수신측이 시리얼라이제이션과 관련하여 그 객체의 클래스를 로드하고 있는지 확인하기 위해 시리얼라이제이션 중에 사용됩니다.수신자가 serialVersion이 다른 객체의 클래스를 로드한 경우대응하는 송신자 클래스의 UID보다 큰 UID로, 역직렬화하면 Invalid Class Exception이 됩니다.직렬화 가능한 클래스는 자체 serialVersion을 선언할 수 있습니다."serialVersion"이라는 이름의 필드를 명시적으로 선언하여 UID를 지정합니다.UID"는 스태틱, 최종, 타입 long이어야 합니다.ANY-ACCESS-MODIPER static final long serialVersionUID = 42L. serialable 클래스가 serialVersion을 명시적으로 선언하지 않는 경우UID를 입력하면 시리얼라이제이션 실행 시 기본 serialVersion이 계산됩니다.Java(TM) Object Serialization Specification에 설명된 대로 클래스의 다양한 측면에 기반한 해당 클래스의 UID 값.단, 시리얼 가능한 모든 클래스는 serialVersion을 명시적으로 선언할 것을 강력히 권장합니다.UID 값(기본 serialVersion 이후)UID 계산은 컴파일러 구현에 따라 달라질 수 있는 클래스의 상세 내용에 매우 민감하기 때문에 역직렬화 중에 예기치 않은 비활성 클래스 예외가 발생할 수 있습니다.따라서 serialVersion의 일관성을 보증하기 위해여러 Java 컴파일러 구현 간의 UID 값. 직렬화 가능한 클래스는 명시적인 serialVersion을 선언해야 합니다.UID 값또한 명시적인 serialVersion은UID 선언은 가능한 한 프라이빗 수식자를 사용합니다.이는 이러한 선언이 즉시 선언하는 class--serialVersion에만 적용되기 때문입니다.UID 필드는 상속된 구성원으로서 유용하지 않습니다.
사용하고 있는 다른 키워드가 있는 경우는, 일시적인 것입니다.
필드를 직렬화할 수 없는 경우 임시로 표시해야 합니다.여기서는 아이템 Cost Price를 일시적인 것으로 표시하여 파일에 기입하지 않도록 합니다.
이제 파일 내의 오브젝트 상태를 기입하고 거기에서 읽어내는 방법에 대해 알아보겠습니다.
public class SerializationExample {
public static void main(String[] args){
serialize();
deserialize();
}
public static void serialize(){
Item item = new Item(1L,"Pen", 12.55);
System.out.println("Before Serialization" + item);
FileOutputStream fileOut;
try {
fileOut = new FileOutputStream("/tmp/item.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(item);
out.close();
fileOut.close();
System.out.println("Serialized data is saved in /tmp/item.ser");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void deserialize(){
Item item;
try {
FileInputStream fileIn = new FileInputStream("/tmp/item.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
item = (Item) in.readObject();
System.out.println("Serialized data is read from /tmp/item.ser");
System.out.println("After Deserialization" + item);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
위의 예에서는 오브젝트의 시리얼화 및 역직렬화의 예를 볼 수 있습니다.
그러기 위해 우리는 두 개의 수업을 이용했다.오브젝트를 시리얼화하기 위해 ObjectOutputStream을 사용했습니다.writeObject 메서드를 사용하여 오브젝트를 파일에 씁니다.
역직렬화에는 객체에서 파일을 읽어내는 ObjectInputStream을 사용했습니다.readObject를 사용하여 파일에서 객체 데이터를 읽습니다.
상기 코드의 출력은 다음과 같습니다.
Before SerializationItem [itemId=1, itemName=Pen, itemCostPrice=12.55]
Serialized data is saved in /tmp/item.ser
After DeserializationItem [itemId=1, itemName=Pen, itemCostPrice=null]
deserialized 객체의 itemCostPrice는 기술되지 않았기 때문에 늘입니다.
직렬화에는 개체의 현재 상태를 스트림에 저장하고 해당 스트림에서 동등한 개체를 복원하는 작업이 포함됩니다.스트림은 객체의 컨테이너로 기능합니다.
Serializable은 인터페이스처럼 호출되지만 실행 시 Serialization 서브시스템에 대한 플래그에 가깝습니다.이 오브젝트를 저장할 수 있다고 합니다.직렬화할 수 있는 개체가 없는 경우와 휘발성 표시 개체를 제외한 모든 개체 인스턴스 변수가 저장됩니다.
애플리케이션의 색상을 옵션으로 변경할 수 있다고 상상해 보십시오.이 설정을 외부에 유지하지 않고 실행할 때마다 색상을 변경해야 합니다.
직렬화는 객체 및 데이터를 파일에 저장 또는 쓰는 기술입니다.「」를 사용해 .ObjectOutputStream
★★★★★★★★★★★★★★★★★」FileOutputStream
를 클릭합니다에에 writeObject();
그림으로 명확한 해설을 위해.자세한 내용은 여기를 참조해 주세요.
다른 시각으로 표현하다.직렬화는 '마커 인터페이스'라고 불리는 인터페이스의 일종입니다.마커 인터페이스는 메서드 선언을 포함하지 않고 인터페이스를 구현하는 클래스를 지정(또는 "마킹")하는 인터페이스입니다.만약 당신이 다형성을 이해한다면 이것은 매우 이치에 맞을 것이다.Serializable 마커 인터페이스의 경우 ObjectOutputStream.write(Object) 메서드는 인수에서 인터페이스를 구현하지 않으면 실패합니다.이는 Java에서 발생할 수 있는 오류이며 ObjectOutputStream일 수 있습니다.write(시리얼화 가능
강력추천 : 조슈아 블로흐의 Effective Java 항목 37을 읽고 자세히 알아보십시오.
시리얼화:파일/네트워크 또는 임의의 장소에 오브젝트 상태 기입(파일 지원 폼 또는 네트워크 지원 폼에 Java 오브젝트 지원 폼의 평균)
역직렬화: 파일/네트워크 또는 어디서든 객체 상태 읽기(평균 파일/네트워크 지원 폼에서 Java 객체 지원 폼으로)
다른 답변에 덧붙여 일반성에 대해 설명하겠습니다.예를 들어, Objective-C에서는 시리얼화를 아카이브라고 부르기도 합니다.
개체를 직렬화하는 것은 바이트 스트림을 바이트 스트림으로 변환하여 바이트 스트림을 개체의 복사본으로 되돌릴 수 있도록 하는 것을 의미합니다.Java 오브젝트는 클래스 또는 그 슈퍼클래스가 java.io 중 하나를 구현하면 시리얼화할 수 있습니다.시리얼 대응 인터페이스 또는 그 서브 인터페이스(java.io).외장 가능.역직렬화는 개체의 직렬화된 형식을 개체의 복사본으로 다시 변환하는 프로세스입니다.
자세한 내용을 보려면 여기를 클릭하십시오.
언급URL : https://stackoverflow.com/questions/3429921/what-does-serializable-mean
'itsource' 카테고리의 다른 글
Nuxt.js에서 현재 경로 이름을 얻는 방법 (0) | 2022.08.30 |
---|---|
Vue 2의 클라이언트 측 검색 결과에서 aria-live 영역의 변경 내용을 제대로 읽지 않음 (0) | 2022.08.30 |
반복 조건부 Vue.js 코드를 리팩터하려면 어떻게 해야 하나요? (0) | 2022.08.30 |
VueJS 컴포넌트 시스템 아키텍처 (0) | 2022.08.30 |
문자열에서 모든 문자 제거 (0) | 2022.08.30 |