CSV
데이터를 표현하는 가장 많이 사용되는 방법 중 하나로 콤마(,) 기준으로 데이터를 구분하는 방법입니다.
apple,banana,Seoul,Korea -> [apple, banana, Seoul, Korea]
banana member = new Member("이수호", "suho@angel.com", 23);// member객체를 csv로 변환 String csv = String.format("%s,%s,%d",member.getName(), member.getEmail(), member.getAge()); System.out.println(csv);
JSON
Member member = new Member("이수호", "suho@ angel.com", 2223);
// member객체를 json으로 변환 String json = String.format( "{\"name\":\"%s\",\"email\":\"%s\",\"age\":%d}", member.getName(), member.getEmail(), member.getAge());System.out.println(json);
참조 ) https://nesoy.github.io/articles/2018-04/Java-Serialize
자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술.
JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술을 역직렬화(Deserialize)라고 부릅니다.
직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태.
java.io.Serializable 인터페이스를 상속받은 객체는 직렬화 할 수 있는 기본 조건입니다.
public class Member implements Serializable { private String name; private String email; private int age; public Member(String name, String email, int age) { this.name = name; this.email = email; this.age = age; } @Override public String toString() { return String.format("Member{name='%s', email='%s', age='%s'}", name, email, age); }}
java.io.ObjectOutputStream를 사용하여 직렬화를 진행합니다.
public static void main(String[] args){ Member member = new Member("김배민", "deliverykim@baemin.com", 25); byte[] serializedMember; try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(member); // serializedMember -> 직렬화된 member 객체 serializedMember = baos.toByteArray(); } } // 바이트 배열로 생성된 직렬화 데이터를 base64로 변환 System.out.println(Base64.getEncoder().encodeToString(serializedMember));}
직렬화 대상이 된 객체의 클래스가 클래스 패스에 존재해야 하며 import 되어 있어야 합니다.
중요한 점은 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 반드시 고려해야 합니다.
자바 직렬화 대상 객체는 동일한 serialVersionUID 를 가지고 있어야 합니다.
private static final long serialVersionUID = 1L;
serialVersionUID이 왜 필요한지 자세한 내용은 아래에 추가하였습니다 :)
java.io.ObjectInputStream를 사용하여 역직렬화를 진행합니다.
public static void main(String[] args){ // 직렬화 예제에서 생성된 base64 데이터 String base64Member = "...생략"; byte[] serializedMember = Base64.getDecoder().decode(base64Member); try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedMember)) { try (ObjectInputStream ois = new ObjectInputStream(bais)) { // 역직렬화된 Member 객체를 읽어온다. Object objectMember = ois.readObject(); Member member = (Member) objectMember; System.out.println(member); } }}
직렬화방법에는 여러 Format이 존재합니다.
표형태의 다량의 데이터를 직렬화할때는 CSV형태
구조적인 데이터는 XML, JSON형태.