2013-10-16 2 views
2

Java 객체를 파일로 직렬화/비 직렬화하는 DZone (http://www.dzone.com/links/r/java_custom_serialization_example.html)의이 코드가 있습니다.네트워크 및 바이트 배열을 통해 Java 객체 직렬화/역 직렬화

final class Hello implements Serializable 
{ 
    int x = 10; 
    int y = 20; 

    public int getX() 
    { 
     return x; 
    } 
    public int getY() 
    { 
     return y; 
    } 
} 


public class SerializedComTest { 

    @AfterClass 
    public static void tearDownAfterClass() throws Exception { 
    } 

    @Test 
    public void testFile() throws IOException, ClassNotFoundException { 
     Hello h = new Hello(); 
     FileOutputStream bs = new FileOutputStream("hello.txt"); // ("testfile"); 
     ObjectOutputStream out = new ObjectOutputStream(bs); 
     out.writeObject(h); 
     out.flush(); 
     out.close(); 

     Hello h2; 
     FileInputStream fis = new FileInputStream("hello.txt"); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     h2 = (Hello) ois.readObject(); 

     assertTrue(10 == h2.getX()); 
     assertTrue(20 == h2.getY()); 
    } 
} 

Java 소켓을 사용하여 직렬화 된 객체를 전송할 수 있습니까? 또한 바이트 배열에 직렬화/직렬화 해제 된 객체를 저장하는 방법도 있습니다.

+1

- 나는에서 힌트를 얻었다. –

답변

6

바이트 배열로 /부터 직렬화하기위한 코드입니다. 앞에`Socket`는`InputStream`와`OutputStream`있다 Java Serializable Object to Byte Array

@Test 
public void testByteArray() throws IOException, ClassNotFoundException, InterruptedException { 
    Hello h = new Hello(); 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutput out = new ObjectOutputStream(bos); 
    out.writeObject(h); 
    byte b[] = bos.toByteArray(); 
    out.close(); 
    bos.close(); 

    Hello h2; 
    ByteArrayInputStream bis = new ByteArrayInputStream(b); 
    ObjectInput in = new ObjectInputStream(bis); 
    h2 = (Hello) in.readObject(); 

    assertTrue(10 == h2.getX()); 
    assertTrue(20 == h2.getY()); 
} 
0

filestream을 objectstream 클래스로 래핑 한 것처럼 소켓에서도 마찬가지입니다. 아니요은 일련 화 된 객체를 문자열에 "저장"해야합니다.

0

Java 소켓을 사용하여 직렬화 된 객체를 전송할 수 있습니까?

ObjectOutputStream에서 출력 스트림을 줄 바꿈하십시오.

또한 직렬화/역 직렬화 된 개체를 문자열에 저장하거나 문자열에서 저장하는 방법은 무엇입니까?

그렇지 않습니다. 직렬화 된 객체는 바이너리이며 바이트 배열로 저장해야합니다. deserialize 된 객체는 객체 자체이며 문자열이 아닙니다.

readObject()writeObject() 방법은 필요하지 않습니다. 그들은 기본적으로 일어나지 않을 일을하지 않습니다.

0

이것은 작동하는 코드이며, http://cyberasylum.janithw.com/object-serialization-over-networks-in-java/에서 힌트를 얻었습니다.

@Test(timeout = 2000) 
public void testStream() throws IOException, ClassNotFoundException, InterruptedException { 
    PingerThread pinger = new PingerThread(9092); 
    pinger.start(); 

    String serverAddress = "localhost"; 
    Socket s; 
    PrintWriter output; 
    BufferedReader input; 
    try { 
     // Client 
     s = new Socket(serverAddress, 9092); 
    } 
    catch (IOException e) 
    { 
     // when error, try again 
     Thread.sleep(500); 
     s = new Socket(serverAddress, 9092); 
    } 

    // send the object over the network 
    Hello h = new Hello(); 

    ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); 
    out.writeObject(h); 
    out.flush(); 

    ObjectInputStream in = new ObjectInputStream(s.getInputStream()); 
    System.out.println("2"); 
    Hello h2; 
    h2 = (Hello) in.readObject(); 

    assertTrue(10 == h2.getX()); 
    assertTrue(20 == h2.getY()); 
} 

private class PingerThread extends Thread { 
    public int portNumber; 

    public PingerThread(int portNumber) { 
     super(); 
     this.portNumber = portNumber; 
    } 

    @Override 
    public void run() { 
     try { 
      ServerSocket listener = new ServerSocket(this.portNumber); 
      Socket socket = listener.accept(); 

      ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); 
      ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); 

      Hello h; 

      while((h = (Hello) in.readObject()) != null) { 
       System.out.println("1"); 
       //h = (Hello) in.readObject(); 
       System.out.println(h.getX()); 
       System.out.println(h.getY()); 

       out.writeObject(h); 
       out.flush(); 
      } 

      System.out.println("OUT"); 
      socket.close(); 
      listener.close(); 

     } catch (IOException | ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

주의 사항이 없습니다. 귀하의 인용문은 그 시점에서 오해됩니다. 그는 자신이 짐작하고 있다고 말한다. Object 스트림은 소켓마다 한 번 만들어 져서 소켓 수명 동안 사용되어야합니다. 그는 또한 교착 상태를 해결하는 방법에 대해서도 잘못 알고있다. 필요한 것은, ObjectInputStream를, 적어도 1 개의 말미에, 바람직하게는 양쪽 모두에서, 최초로, ObjectInputStream의 전에 작성해야한다는 것입니다. 이 답변에는 귀하의 질문에 다른 답변과 귀하의 코드가 함축되어 있지 않습니다. – EJP

관련 문제