在applet 中代码如下:
public static void sendNetObjectResult(String url, ArrayList pointList){
try{
URL mapServer = new URL(url);
URLConnection s = mapServer.openConnection();
s.setUseCaches(false);
s.setDoOutput(true);
ObjectOutputStream bw = new ObjectOutputStream(s.getOutputStream());
bw.writeObject(pointList);
bw.flush();
DataInputStream in = new DataInputStream(s.getInputStream());
String result = in.readUTF();
System.out.println("result:"+result);
in.close();
bw.close();
}catch(Exception e){

}
}在servlet中 代码如下:
public static ArrayList getNetObjectResult(HttpServletRequest request, HttpServletResponse response) {
ArrayList pointArray = null;
try {
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
pointArray = (ArrayList) ois.readObject();
            DataOutputStream out = new DataOutputStream(response.getOutputStream());
            out.writeUTF("success");
            out.flush();
ois.close();            
            out.close();
return pointArray;
}catch(Exception e){
e.printStackTrace();
}
return null;
}   运行后 结果抛出异常:
java.io.StreamCorruptedException: invalid stream header
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753
)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
        at tp.util.UtilTools.getNetObjectResult(UtilTools.java:39)
        at tp.web.MapperServlet.renderMap(MapperServlet.java:215)
        at tp.web.MapperServlet.service(MapperServlet.java:94)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:90)
        at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterC
hain.java:99)
        at tp.web.EncodingFilter.doFilter(EncodingFilter.java:31)
        at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterCha
in.java:70)
        at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain
.java:163)
        at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocatio
n.java:208)
        at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:259
)
        at com.caucho.server.port.TcpConnection.run(TcpConnection.java:341)
        at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:467)
        at com.caucho.util.ThreadPool.run(ThreadPool.java:408)
        at java.lang.Thread.run(Thread.java:595)请问高手 这是哪里出了问题呢?

解决方案 »

  1.   

    不太清楚,帮忙挺一下。前一段想用applet,怕麻烦放弃了
      

  2.   

    显然是对象序列化的错误,applet将对象序列化为一个文件,传递到servlet,servlet通过反序列化的方式来获得对象,从出错信息来看,在servlet反序列化的时候,发现序列化的文件格式不对,不然创建ObjectInputStream. 如果你的applet没有实现序列化接口,则不能使用序列化方法的,建议你检查一下applet的实现。
      

  3.   

    跟applet有关系码?我是传ArrayList 类型的数据 如下:
    public static void sendNetObjectResult(String url, ArrayList pointList)在servlet中获得 ArrayList 的数据 应该跟applet序列化没什么关系把如果有关系 应该怎样处理呢?
      

  4.   

    一个类如果要求序列化,那么首先它要实现Serializable接口,还要求它的成员都必须能够序列化,也就是ArrayList中存放的数据,也必须实现这个接口。
    因此,ArrayList本身实现了Serializable没有问题,但是List中存放的对象,假如是你自己定义的,没有实现Serializable,那么也是不行的,序列化后的内容将不能反序列化,会出现上面的序列化文件头部不能识别的错误。
      

  5.   

    cathy97(男人练瑜伽好处多)  非常感激你的回帖可是 在我的ArrayList里面 存放的都是Double[] 如:
    Double[] doubleArray = new Double[2];
    doubleArray[0] = new Double(e.getX());
    doubleArray[1] = new Double(e.getY());
    pointList.add(doubleArray);你说这样有没有问题呢?
      

  6.   

    HTTP又不是Socket,写什么都读什么呀!看看HTTP协议吧
      

  7.   

    关注,我也在弄applet和servlet互相传递xml的项目
      

  8.   

    奇怪,我试了一下没错呀,能把你的Servlet代码都贴出来么
      

  9.   

    package tp.web;import tp.util.CMapXtremeExtendFunction;
    import com.mapinfo.mapj.MapJ;
    import com.mapinfo.mapxtreme.client.MapXtremeImageRenderer;
    import com.mapinfo.util.DoublePoint;
    import com.mapinfo.util.DoubleRect;
    import com.mapinfo.xmlprot.mxtj.ImageRequestComposer;
    import java.awt.Color;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import tp.util.UtilTools;;
    public class MapperServlet extends HttpServlet
    {
        private static String m_mapPath = "";
        private static String m_fileToLoad = "";
        private static String m_mxtURL = "";
        private boolean m_debug = false;
        private int m_mapWidth = 500;
        private int m_mapHeight = 350;
    public final int NO_TOOL = 0; //取消操作
    public final int ZOOM_IN_TOOL = 1; //普通放大
    public final int ZOOM_OUT_TOOL = 2; //普通缩小
    public final int PAN_TOOL = 3; //平移
    private final int Rect_TOOL = 4; //矩形拉框放大
    public final int DISTANCE_TOOL = 5; //测距离
    private final int DrawPoints_TOOL = 11; //画点
    private final int DrawPolygons_TOOL = 13; //画多边形
        public static final int NUM_OF_COLORS = 256;
        public static final Color BACKGROUND_COLOR = Color.WHITE;    public MapperServlet(){
        }    public void init(ServletConfig config)
            throws ServletException {
            super.init(config);
            String strParam = getInitParameter("mappath");
            if(strParam != null){
                m_mapPath = strParam;
            }
            strParam = getInitParameter("filetoload");
            if(strParam != null){
                m_fileToLoad = strParam;
            }
            strParam = getInitParameter("mapxtremeurl");
            if(strParam != null && strParam.length() > 0){
                m_mxtURL = strParam;
            }
            strParam = getInitParameter("mapwidth");
            if(strParam != null){
                m_mapWidth = Integer.valueOf(strParam).intValue();
            }
            strParam = getInitParameter("mapheight");
            if(strParam != null){
                m_mapHeight = Integer.valueOf(strParam).intValue();
            }
            strParam = getInitParameter("debug");
            if(strParam != null && strParam.equalsIgnoreCase("true")){
                m_debug = true;
            }
        }    public void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
            HttpSession session = req.getSession(true);
         String reqParam = ""; //获得request请求的临时变量             
            if(req.getParameter("init") != null) {
                reqParam = req.getParameter("mapwidth");
         if (reqParam != null) {
         m_mapWidth = Integer.parseInt(reqParam);
         }
         reqParam = req.getParameter("mapheight");
         if (reqParam != null) {
         m_mapHeight = Integer.parseInt(reqParam);
         }          
                res.setContentType("text/html");
                PrintWriter out = new PrintWriter(res.getOutputStream());
                String thisServletName = HttpUtils.getRequestURL(req).toString();
                out.println(res.encodeURL(thisServletName));
                out.close();
            } else {
                if(m_debug){
                    debugSession(req, session);
                }
                try {
                    renderMap(session, req, res);
                }
                catch(ServletException se) {
                    log(se.getMessage());
                    throw se;
                }
                catch(IOException ioe) {
                    log(ioe.getMessage());
                    throw ioe;
                }
                catch(Exception e) {
                    log(e.getMessage());
                }
            }
        }
      

  10.   

    public MapJ initMapJ()
            throws Exception {
            MapJ myMap = new MapJ();
            myMap.setDeviceBounds(new DoubleRect(0.0D, 0.0D, m_mapWidth, m_mapHeight));
            try {
                if(m_fileToLoad.endsWith(".gst")) {
                    myMap.loadGeoset(m_fileToLoad, m_mapPath, null);
                } else {
                    myMap.loadMapDefinition(m_fileToLoad);
                }
            }
            catch(Exception e) {
                log("Can't load geoset: " + m_fileToLoad + "\n");
                throw e;
            }
            return myMap;
        }    private void renderMap(HttpSession session, HttpServletRequest req, HttpServletResponse res)
            throws Exception
        {
            Double xStr = null; //精度临时变量
            Double yStr = null; //纬度临时变量
    Double ptx1 = null;  // 测距离起点x坐标
    Double pty1 = null;  // 测距离起点y坐标
    Double ptx2 = null;  // 测距离终点x坐标
    Double pty2 = null;  // 测距离终点x坐标        
            int tool = 0; //体图工具栏对应变量
            String reqParam = ""; //获得request请求的临时变量
            if((reqParam = req.getParameter("tool")) != null) {
                tool = Integer.valueOf(reqParam).intValue();
            }        
            MapJ myMap = (MapJ)session.getAttribute("mapinfo.mapj");
            if(myMap == null){
                myMap = initMapJ();
            }  
            if(tool != NO_TOOL) {
                DoublePoint newpoint = myMap.getCenter();
                double newZoom = myMap.getZoom();            
                if((reqParam = req.getParameter("ptx")) != null) {
                    xStr = new Double(reqParam);
                }
                if((reqParam = req.getParameter("pty")) != null) {
                    yStr = new Double(reqParam);
                }
                if(xStr != null && yStr != null) {
                    DoublePoint screenpoint = new DoublePoint(xStr.doubleValue(), yStr.doubleValue());
                    newpoint = myMap.transformScreenToNumeric(screenpoint);
                }
                if(tool == ZOOM_IN_TOOL) {
                    newZoom /= 2D;
                    myMap.setZoomAndCenter(newZoom, newpoint);                
                }
                if(tool == ZOOM_OUT_TOOL) {
                    newZoom *= 2D;
                    myMap.setZoomAndCenter(newZoom, newpoint);                
                }
                if(tool == PAN_TOOL) {
                    myMap.setZoomAndCenter(newZoom, newpoint); 
                } 
         if (tool == DISTANCE_TOOL) {
         if ((reqParam = req.getParameter("ptx1")) != null) {
         ptx1 = new Double(reqParam);
         }
         if ((reqParam = req.getParameter("pty1")) != null) {
         pty1 = new Double(reqParam);
         }
         if ((reqParam = req.getParameter("ptx2")) != null) {
         ptx2 = new Double(reqParam);
         }
         if ((reqParam = req.getParameter("pty2")) != null) {
         pty2 = new Double(reqParam);
         }
         if (ptx1 != null && pty1 != null && ptx2 != null && pty2 != null) {
         DoublePoint firstPoint = new DoublePoint(ptx1.doubleValue(), pty1.doubleValue());
         DoublePoint secondPoint = new DoublePoint(ptx2.doubleValue(), pty2.doubleValue());
         firstPoint = myMap.transformScreenToNumeric(firstPoint);
         secondPoint = myMap.transformScreenToNumeric(secondPoint);
         double distance = myMap.sphericalDistance(firstPoint, secondPoint);
         UtilTools.sendNetDoubleResult(String.valueOf(distance), res);
         }
         }
    if (tool == Rect_TOOL) {
    reqParam = req.getParameter("Zoom");
    Double zoom = null;
    if (reqParam != null) {
    zoom = new Double(reqParam);
    newZoom /= zoom.doubleValue();
    }
    if ((reqParam = req.getParameter("ptx")) != null) {
    ptx1 = new Double(reqParam);
    }
    if ((reqParam = req.getParameter("pty")) != null) {
    pty1 = new Double(reqParam);
    }
    DoublePoint screenpoint = new DoublePoint(ptx1.doubleValue(), pty1.doubleValue());
    newpoint = myMap.transformScreenToNumeric(screenpoint);
    myMap.setZoomAndCenter(newZoom, newpoint);
    }
    if (tool == DrawPoints_TOOL){
    CMapXtremeExtendFunction functionTool = new  CMapXtremeExtendFunction();
            functionTool.DrawPoints(myMap,newpoint,"Annotations","小车") ;
            functionTool.createLabelFeature(myMap,"Annotations");
    }
    if (tool == DrawPolygons_TOOL){
    ArrayList pointList = UtilTools.getNetObjectResult(req,res);
    CMapXtremeExtendFunction functionTool = new  CMapXtremeExtendFunction();
    DoublePoint[] pointArray = new DoublePoint[pointList.size()];
    for(int i=0; i<pointList.size(); i++){
    pointArray[i] = new DoublePoint();
    pointArray[i].set((double[])pointList.get(i));
    }
    functionTool.DrawPolygons(myMap, pointArray, pointList.size(), "Annotations");
            session.setAttribute("mapinfo.mapj", myMap);
    return;
    }
                if(m_debug) {
                    log("tool: " + tool + "  setting zoom to: " + newZoom + " at: " + newpoint);
                }
            }
            try {
                MapXtremeImageRenderer rr = new MapXtremeImageRenderer(m_mxtURL);
                rr.render(ImageRequestComposer.create(myMap, 256, BACKGROUND_COLOR, "image/gif"));
                rr.toStream(res.getOutputStream());
            }
            catch(Exception e) {
                log(e.getMessage());
                throw e;
            }
            session.setAttribute("mapinfo.mapj", myMap);
        }    private void debugSession(HttpServletRequest req, HttpSession session) {
            log("Request and Session Data:");
            log("Session ID in Request: " + req.getRequestedSessionId());
            log("Session ID in Request from Cookie: " + req.isRequestedSessionIdFromCookie());
            log("Session ID in Request from URL: " + req.isRequestedSessionIdFromURL());
            log("Valid Session ID: " + req.isRequestedSessionIdValid());
            log("Session Data:");
            log("New Session: " + session.isNew());
            log("Session ID: " + session.getId());
            log("Creation Time: " + session.getCreationTime());
            log("Last Accessed Time: " + session.getLastAccessedTime());
        }}
      

  11.   

    treeroot(旗鲁特)   以上是我的servlet的代码 
      

  12.   

    If the parameter data was sent in the request body, such as occurs with an HTTP POST request, then reading the body directly via getInputStream() or getReader() can interfere with the execution of this method.
      

  13.   

    可能和你调用了getParameter方法有关
      

  14.   

    感谢 treeroot(旗鲁特) 为我做的解答可是我必须先调用getParameter方法 reqParam = req.getParameter("tool")) 
    再根据 reqParam 的值来决定程序的流转啊 实在是不好办啊