ObjectOutputStream 必顺用到参数FileOutputStream 吗,有没有把一个对象序列化到一个字符串中的啊 
FileOutputStream 是生成一个文件,不能成为字符串。

解决方案 »

  1.   

    ObjectOutputStream是封装OutputStream的你说的传到字符串不可以。字符串是个类,里面实际上是byte数组,这两个风马牛不相及可以用ByteArrayOutputStream替换FileOutputStream 将对象变成byte数组。不过这和你说的String不一样
      

  2.   

    to:fool_leave(请及时结贴)
    我想要达到的目的是把一个对象序列化之后放入一个soap消息中去。
    而org.apache.axis.encoding.SerializationContext的write方法只能放String 类型的值,
    所以我只有把一个对象序列化成String了,有什么好的方法吗?
      

  3.   

    to:rumlee(rum-lee)
    反序列化是用ObjectInputStream好像不能用ByteArrayOutputStream这个参数啊!它报错啊
      

  4.   

    用ObjectInputStream来封装一下ByteArrayOutputStream就可以了出来的是一个byte数组,也只能得到byte数组,如果把byte数组变为String就会出问题的soap能传byte数组吗?
      

  5.   

    打错了
    用ObjectInputStream来封装一下ByteArrayInputStream就可以了
      

  6.   

    ByteArrayOutputStream得到byte数组这个数组传输到对方,再通过ByteArrayInputStream将数组构件成流,然后用ObjectInputStream读取对象
      

  7.   

    soap好像不能传byte数组啊!有其它的办法吗!
      

  8.   

    问题部分解决,可以把它序列化到一个byte〔〕里面去,但是还是不能被封装到Soap中去。有代进一步解决
    代码如下 :
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.*;public class MyXmlSerializer implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static void myXmlSerializer()
    {
    ArrayList<String> myAL=new ArrayList<String>();
    myAL.add("aaaaaa!");
    System.out.println("我的ArrayList: "+myAL.get(0));
    //序列化使用的输出流
    ObjectOutputStream OOS=null;
    //序列化后数据流给ByteArrayOutputStream 来保存。
    //ByteArrayOutputStream 可转成字符串或字节数组
    ByteArrayOutputStream BAOS=new ByteArrayOutputStream();
    //ByteArrayInputStream 可接收一个字节数组"byte[]"。供反序列化做参数
    ByteArrayInputStream BAIS=null;
    //反序列化使用的输入流
    ObjectInputStream OIS=null;
    try {
    //byte[] myb="s";
    OOS=new ObjectOutputStream(BAOS);
    OOS.writeObject(myAL);
    byte[] abc=BAOS.toByteArray();
    System.out.println(abc);
    String StrMySerializer=abc.toString();
    System.out.println("序列化: "+StrMySerializer);
    OOS.close();

    byte[]ddd=StrMySerializer.getBytes();
    System.out.println(ddd);
    BAIS=new ByteArrayInputStream(abc);
    OIS=new ObjectInputStream(BAIS);
    ArrayList c=(ArrayList)(OIS.readObject());
    System.out.println("反序列化: "+c.get(0));
    OIS.close();

    catch (IOException e) {e.printStackTrace();}
    catch (Exception ex) {System.out.println("序列化时产生错误");}
    }
    public static void main(String[] args){
    myXmlSerializer();
    }
    }
      

  9.   

    正解:
    这一版没有把它写成服务\客户端的形式package com;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.*;public class ArrayListSerializ implements Serializable{
    /**
     * 此例是一个序列化/反序列化的方法 :
     * 
     * 主要思想是把一个对象写入对象输出流,然后把这个流里面的数据导入字节数组输出流
     * 再把字节数组输出流导入到字节数组。这时,由于byte[]数组是从ObjectOutputStream之后得来的,
     * 那么是不可以new String(buff)的,因为其中包含了不可见字符,根本不是一个字符串。
     * 只能用sun.misc.BASE64Encoder把它翻译成字符串形式。
     * 至此,这就完成了序列化成字符串行式的过程
     * 
     * 再通过sun.misc.BASE64Decoder().decodeBuffer把字符串转换成一个byte[],
     * 然后通过其反思路完成反序列化过程
     */
    private static final long serialVersionUID = 1L;
    private static void myArrayListSerializer()
    {
    ArrayList<String> myAL=new ArrayList<String>();
    myAL.add("This is a serial programme.author: 张正明");
    System.out.println("ArrayList's content: "+myAL.get(0));
    //序列化使用的输出流
    ObjectOutputStream OOS=null;
    //序列化后数据流给ByteArrayOutputStream 来保存。
    //ByteArrayOutputStream 可转成字符串或字节数组
    ByteArrayOutputStream BAOS=new ByteArrayOutputStream();
    //ByteArrayInputStream 可接收一个字节数组"byte[]"。供反序列化做参数
    ByteArrayInputStream BAIS=null;
    //反序列化使用的输入流
    ObjectInputStream OIS=null;
    try {
    OOS=new ObjectOutputStream(BAOS);
    OOS.writeObject(myAL);
    byte[] buff=BAOS.toByteArray();

     /*由于byte[]数组是从ObjectOutputStream之后得来的,
      *那么是不可以new String(buff)的,因为其中包含了不可见字符,根本不是一个字符串
      */
    System.out.println("序列化成一个byte[]的字符串形式 :"+buff);
    //转换成字符串
    sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
    String Sstr = encoder.encode(buff);
    System.out.println("序列化成一个字符串:"+Sstr);
    System.out.println("检查序列化成一个字符串和序列化成一个byte[]是否为同一个内容:"+
    Arrays.equals(buff, new sun.misc.BASE64Decoder().decodeBuffer(Sstr)));
    OOS.close();

                // 把字符串转成一个byte[]
    byte[] DSbuff=new sun.misc.BASE64Decoder().decodeBuffer(Sstr);
    System.out.println("反序列化成一个byte[]字符串形式 :"+DSbuff);
    //实现反序列化
    BAIS=new ByteArrayInputStream(DSbuff);
    OIS=new ObjectInputStream(BAIS);
    ArrayList c=(ArrayList)(OIS.readObject());
    System.out.println("反序列化后取提ArrayList的数据: "+c.get(0));
    OIS.close();

    catch (IOException e) {e.printStackTrace();}
    catch (Exception ex) {System.out.println("序列化时产生错误");}
    }
    public static void main(String[] args){
    myArrayListSerializer();
    }
    }