`
songbin0201
  • 浏览: 323106 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java IO 篇之ObjectOutputStream、ObjectInputStream

 
阅读更多
public class TransObjectJava implements TransObject{

    @Override
    public Person decoder(String objstr) {
        ObjectInputStream ois = null;
        try {
            ByteArrayInputStream bai = new ByteArrayInputStream(objstr.getBytes());
            ois = new ObjectInputStream(bai);
            Person obj = (Person)ois.readObject();
            return obj;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }finally{
            try {
                ois.close();
                ois = null;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    @Override
    public String encoder(Person obj) {
        ObjectOutputStream oos = null;
        try{
            ByteArrayOutputStream bao = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bao);
            oos.writeObject(obj);
            return bao.toString();
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }finally{
            try {
                oos.close();
                oos = null;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }
}



对象序列化、反序列化过程将对象以string形式输出,以byte[] 方式反序列化成对象
报异常 java.io.StreamCorruptedException: invalid stream header: EFBFBDEF,原因如下:
The provided test code serializes an object to a ByteArrayOutputStream,
converts the generated byte array into a string using the
ByteArrayOutputStream.toString() method, converts the string back into a byte
array using the String.getBytes() method, and then attempts to deserialize the
object from the byte array using a ByteArrayInputStream.  This procedure will
in most cases fail because of the transformations that take place within
ByteArrayOutputStream.toString() and String.getBytes(): in order to convert the
contained sequence of bytes into a string, ByteArrayOutputStream.toString()
decodes the bytes according to the default charset in effect; similarly, in
order to convert the string back into a sequence of bytes, String.getBytes()
encodes the characters according to the default charset.

Converting bytes into characters and back again according to a given charset is
generally not an identity-preserving operation.  As the javadoc for the
String(byte[], int, int) constructor (which is called by
ByteArrayOutputStream.toString()) states, "the behavior ... when the given
bytes are not valid in the default charset is unspecified".  In the test case
provided, the first two bytes of the serialization stream, 0xac and 0xed (see
java.io.ObjectStreamConstants.STREAM_MAGIC), both get mapped to the character
'?' since they are not valid in the default charset (ISO646-US in the JDK I'm
running).  The two '?' characters are then mapped back to the byte sequence
0x3f 0x3f in the reconstructed data stream, which do not constitute a valid
header. 

The solution, from the perspective of the test case, is to use
ByteArrayOutputStream.toByteArray() instead of toString(), which will yield the
raw byte sequence; this can then be fed directly to the
ByteArrayInputStream(byte[]) constructor.


因为序列化时,加入对象header的字节 final static short STREAM_MAGIC = (short)0xaced; 在默认的字符集中为无效字节,标记为?,反序列化时就无法正常还原对象header数据,因此反序列化失败

解决方法如下:
1、序列化输出字节数组  byteArrayOutputStream.toByteArray();
反序列化用字节数组还原对象
2、序列化输出字符串,使用ISO-8859-1编码 byteArrayOutputStream.toSting("ISO-8859-1");反序列化时使用ISO-8859-1编码还原对象 ByteArrayInputStream bai = new ByteArrayInputStream(objstr.getBytes("ISO-8859-1"));
分享到:
评论

相关推荐

    java IO.chm

    这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、文件操作、对象序列化以及NIO(非阻塞IO)等多个方面进行展开。 一、Java IO体系结构 Java IO体系是Java平台中用于处理数据输入...

    Java IO处理类的汇总

    此外,还有对象流如ObjectInputStream和ObjectOutputStream,用于序列化和反序列化Java对象。 Java IO还引入了缓冲区的概念,提高了读写效率。BufferedInputStream、BufferedOutputStream、BufferedReader和...

    java io 结构图

    `ObjectInputStream` 和 `ObjectOutputStream` 用于序列化和反序列化对象。 Java IO还包含了过滤流(Filter Stream)的概念,它们在原有流的基础上增加了额外的功能,如转换、压缩、加密等,比如 `...

    Java IO_NIO

    还有缓冲流(BufferedInputStream、BufferedReader等)用于提高读写效率,转换流(InputStreamReader、OutputStreamWriter)用于在字节流和字符流之间转换,以及对象流(ObjectInputStream、ObjectOutputStream)...

    java小项目练习IO实现

    在Java中,我们可以使用`java.io.Serializable`接口标记需要序列化的类,然后利用`ObjectOutputStream`进行序列化,`ObjectInputStream`进行反序列化。 1. **序列化**:当一个对象需要被保存或者在网络上传输时,...

    Java基础篇:IO流.pdf

    - 对象流,如ObjectInputStream和ObjectOutputStream,用于对象的序列化和反序列化。 Java IO流的使用涉及到流的打开、数据的读写操作和流的关闭。正确地使用流可以避免内存泄漏和其他资源问题。在实际开发中,通常...

    java io.pdf

    ObjectInputStream和ObjectOutputStream负责对象的序列化和反序列化。 5. **管道流(Pipe Streams)**:在多线程环境中,管道流允许线程间的数据通信。PipedInputStream和PipedOutputStream就是这样的例子。 6. **...

    java-IO框架图

    例如,javaio.bmp和javaio2.bmp可能是两张展示IO框架图的图片,其中详细描绘了不同类之间的继承关系和使用场景,帮助开发者更好地理解和掌握Java IO系统。 总结一下,Java IO框架是Java平台不可或缺的一部分,它为...

    Java IO 使用例

    在“JavaIODemo”这个示例中,可能会包含以上提到的一些或全部Java IO操作的代码实例,通过这些实例,我们可以学习如何在实际项目中应用Java IO API。实践是掌握Java IO的最佳方式,通过对这些示例的分析和运行,...

    Java_IO完全总结

    Java IO系统的设计原则之一是高度模块化和可扩展性,通过抽象出一系列接口来支持各种不同类型的I/O操作。例如,`InputStream`和`OutputStream`接口分别用于读取和写入数据,它们构成了Java IO系统的核心基础。此外,...

    Java io的基本操作很全面的代码呀

    - 数据的序列化和反序列化:通过ObjectInputStream和ObjectOutputStream进行对象的保存和恢复。 - 字符编码转换:InputStreamReader和OutputStreamWriter可以处理不同字符集的转换。 - 管道流的使用:创建两个线程,...

    Java IO 工具类大全

    本篇文章将全面解析Java IO工具类,帮助你理解并掌握其在实际开发中的应用。 一、Java IO基础 Java IO体系主要由流(Stream)组成,分为字节流和字符流两大类,分别处理字节数据和字符数据。字节流包括InputStream...

    java IO流+socket源码 实现简单文本传输

    除此之外,还有缓冲流(Buffered)、转换流(InputStreamReader/OutputStreamWriter)以及对象流(ObjectInputStream/ObjectOutputStream)等,它们各自有不同的功能和用途。 Socket,又称套接字,是网络通信的基础...

    java零基础自学 之 JavaIO流处理

    ObjectInputStream和ObjectOutputStream则用于序列化和反序列化Java对象,实现对象的持久化存储。 7. **管道流** 管道流(PipedReader、PipedWriter、PipedInputStream和PipedOutputStream)允许在不同线程间进行...

    IO流 javaio java 流

    - 对象流(ObjectInputStream/ObjectOutputStream):用于序列化和反序列化Java对象。 2. 字符流: - 字符输入流(Reader):如FileReader,用于读取字符数据,通常用于处理文本文件。 - 字符输出流(Writer):...

    Java IO合集

    例如,FileInputStream和FileOutputStream用于读写文件,BufferedReader和PrintWriter用于文本数据的读写,而ObjectInputStream和ObjectOutputStream则支持对象的序列化和反序列化。此外,过滤流(Filter Streams)...

    java io最简java io

    Java IO(Input/Output)是Java编程语言中用于处理输入和输出操作的重要组成部分。它提供了丰富的类库,允许程序员在各种设备、文件、网络连接之间进行数据传输。在这个主题中,我们将深入探讨Java IO的基本概念、...

    javaIO详细讲解+详细案例

    ### Java IO 流详解 #### 一、Java IO 流概念及作用 Java IO(Input/Output)流是Java编程语言中的一个重要组成部分,主要用于处理数据的输入与输出。流(Stream)可以理解为一组有序的、有起点和终点的字节集合,...

    javaIO实例

    `ObjectInputStream`和`ObjectOutputStream`用于序列化和反序列化对象;`PipedInputStream`和`PipedOutputStream`则用于线程间的通信。 此外,NIO(New IO)是Java 1.4引入的扩展,提供了一种非阻塞I/O模型,提高了...

Global site tag (gtag.js) - Google Analytics