标签: objectoutputstream

ObjectInputStream错误

我正在使用ObjectOutputStream来创建序列化对象的文件.然后我使用ObjectInputStream与readObject()方法一起从文件中取出对象.

它第一次很棒.这意味着如果文件不存在并且我打开它然后附加任意数量的对象,我可以打开ObjectInputStream对象并访问所有对象.

但是,如果我随后打开相同的文件(使用append选项)并添加更多对象,则ObjectInputStream对象将获取java.io.StreamCorruptedException:"无效的类型代码:AC"错误,其中新对象应该启动.

有没有其他人遇到这个?我甚至回到了Deitel书中的一些基本教科书示例,但仍然得到了同样的错误.

编辑:我发现了这一点 - 一旦关闭并在追加模式下重新打开,您可能不会附加到序列化流的末尾.写入似乎有效,但是当您稍后再读取该文件时,您将获得java.io.StreamCorruptedException.在" http://mindprod.com/jgloss/gotchas.html#SERIALIZATION "

java objectoutputstream objectinputstream

5
推荐指数
1
解决办法
5427
查看次数

如何覆盖ObjectOutputStream.writeStreamHeader()?

ObjectOutputStream.writeStreamHeader()可以重写该方法以在数据头前添加或附加数据.但是,如果该数据基于传递给派生类的构造函数的参数,如:

public class MyObjectOutputStream extends ObjectOutputStream {

    public MyObjectOutputStream( int myData, OutputStream out ) throws IOException {
        super( out );
        m_myData = myData;
    }

    protected void writeStreamHeader() throws IOException {
        write( m_myData );            // WRONG: m_myData not initialized yet
        super.writeStreamHeader();
    }

    private final int m_myData;
}
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为super()m_myData初始化和super()调用之前调用它writeStreamHeader().我能想到解决这个问题的唯一方法就是使用ThreadLocal:

public class MyObjectOutputStream extends ObjectOutputStream {

    public MyObjectOutputStream( int myData, OutputStream out ) throws IOException {
        super( thunk( myData, out ) ); …
Run Code Online (Sandbox Code Playgroud)

java constructor objectoutputstream thread-local

5
推荐指数
1
解决办法
3009
查看次数

Socket上的Java ObjectOutputStream不是flush()ing

我正在研究用Java编写的网络应用程序,在套接字上使用ObjectOutputStream和ObjectInputStream来交换消息.我的代码看起来像这样:

发件人:

ObjectOutputStream out;
ObjectInputStream in;
try{
     Socket socket=new Socket(address, port);
     socket.setSoLinger(true, socketLingerTime);
     out=new ObjectOutputStream(socket.getOutputStream());
     out.writeObject(message);
     out.flush();
     out.close();
}catch (variousExceptions)...
Run Code Online (Sandbox Code Playgroud)

接收器:

Object incoming;
try{
    incoming=myObjectInputStream.readObject();
}catch (SocketException socketError)
{
    if (socketError.getMessage().equals("Connection reset"))
    {
        //this is the exception I get
    }
}
Run Code Online (Sandbox Code Playgroud)

有时消息会通过ok,但有时我会得到标记的异常而不是对象.是不是应该强制将消息强制传递给另一方?我以某种方式错误地使用该功能?或者这是底层Java/OS网络代码中的某种错误?

谢谢!

更新:

我已经对此做了更多的窥探,似乎只有当系统的资源被某些东西征税时才会发生.我无法在VirtualBox之外复制它,但这可能只是因为VirtualBox没有很多资源可以开始.当我进一步研究它时,我会更新这个问题.

java sockets flush objectoutputstream

5
推荐指数
1
解决办法
7260
查看次数

通过套接字发送匿名类?(Java中的Object..Stream)

所以现在,我有一个运行的服务器ObjectInputStreamObjectOutputStream.

我遇到的问题是我有一个自定义(匿名)类,它扩展java.lang.Date了我试图发送到客户端然后编译.

所以我没有在客户端定义类,但我想以编程方式编译类.我尝试了很多不同的方法,但每次我得到一个ClassNotFoundException因为该类最初不在客户端.

Class<?> dateClass = (Class<?>) in.readObject(); //This is where the CNF Exception occurs
Compiler.compileClass(dateClass);
Run Code Online (Sandbox Code Playgroud)

java class objectoutputstream objectinputstream classnotfoundexception

5
推荐指数
1
解决办法
1737
查看次数

Java:使用不带序列化的ObjectOutputStream

有时,我想使用an ObjectOutputStream来写文件或通过网络发送一些小图像.但是BufferedImage许多其他类没有实现java.io.Serializable,然后Stream取消了写入.有没有办法避免这种情况?

谢谢,Martijn

java io serialization objectoutputstream

4
推荐指数
2
解决办法
4118
查看次数

ObjectOutputStream的writeObject方法使用什么字符编码?

我读到Java在内部使用UTF-16编码。即我明白,如果我喜欢:String var =“ ????”; 然后是“ ????” 将在内部以UTF-16编码。因此,如果我将此变量转储到某些文件中,例如:

fileOut = new FileOutputStream("output.xyz");
out = new ObjectOutputStream(fileOut);
out.writeObject(var);
Run Code Online (Sandbox Code Playgroud)

字符串“ ????”的编码 在文件“ output.xyz”中是否为UTF-16?另外,稍后,如果我想通过ObjectInputStream从文件“ output.xyz”中读取信息,是否可以获取该变量的UTF-16表示形式?

谢谢。

java objectoutputstream utf-16 character-encoding fileoutputstream

4
推荐指数
2
解决办法
6901
查看次数

ObjectInputStream给了我一个空对象(但是readed文件不为空)

我有这个可序列化的类,我用它来存储一个二进制文件的字符串ArrayList.

public class SaveState implements Serializable{
   public static ArrayList <String> favoriteBusStopNumbers = new ArrayList<String>();
   public static SaveState instance=new SaveState();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此方法来存储带有arrayList字符串的实例一旦此数组已满,我必须存储的数据:

public static void saveData(){
    ObjectOutput out;
    try {
        //primero comprobamos si existe el directorio, y si no, lo creamos.
        File folder = new File(Environment.getExternalStorageDirectory() + DIRECTORY_NAME);
        if(!folder.exists())
            folder.mkdirs();

        File outFile = new File(Environment.getExternalStorageDirectory(), DIRECTORY_NAME+"appSaveState.data");
        out = new ObjectOutputStream(new FileOutputStream(outFile)); 
        out.writeObject(SaveState.instance);
        out.close();
    } catch (Exception e) {e.printStackTrace();}
}
Run Code Online (Sandbox Code Playgroud)

最后,我在我的应用程序的init上使用此方法来加载文件并使用以前存储的数据填充我的SaveState.instance变量:

public static void loadData(){
    ObjectInput in;
    try {
        File inFile = …
Run Code Online (Sandbox Code Playgroud)

java serialization android objectoutputstream objectinputstream

4
推荐指数
1
解决办法
1712
查看次数

序列化和简单地将对象存储在磁盘上有什么区别?

我对此感到困惑。因为在实现 Serializable 类时,我们需要使用类似的类FileOutputStreamObjectOutputStream或者类似的东西。那我们为什么不直接用这些类来做输出对象到文件、从文件输入对象这样的事情,直接维护对象的状态呢?为什么我们要先实现 Serializable 然后再做同样的事情?

java serialization objectoutputstream serializable fileoutputstream

4
推荐指数
1
解决办法
4974
查看次数

服务器和客户端必须具有声明 ObjectOutputStream 和 ObjectInputStream 的相反顺序吗?

在我的实验中,

如果服务器有这个:

ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
Run Code Online (Sandbox Code Playgroud)

然后客户端必须以相反的顺序执行此操作:

ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
Run Code Online (Sandbox Code Playgroud)

否则服务器和客户端会死锁。

这是什么原因?是否有正式的 API 规范?

java sockets serialization objectoutputstream objectinputstream

3
推荐指数
1
解决办法
484
查看次数

为什么当我通过 writeObject 方法发送对象时它没有改变?

我正在用Java 制作网络程序。正如标题所示,服务器尝试发送的对象在接收它的客户端中发生了变化。我试图在从服务器收到新对象之前更改客户端中存在的对象。这是我的代码。第一个是 Server.sendIdea,第二个是 Client.rcvIdea。

void sendIdea(Idea _idea) throws IOException {
    objectOS.flush();
    Idea idea = _idea;
//when I look into 'idea' it's fine
    objectOS.writeObject(idea);
}
Run Code Online (Sandbox Code Playgroud)

..

Idea rcvIdea(int _ideaCode) throws ClassNotFoundException, IOException {
    objectOS.writeObject("sendIdea");
    objectOS.writeObject(_ideaCode);
    Idea returnValue = (Idea) objectIS.readObject();
//when I look into 'returnValue', it is not the one 'sendIdea' has sent.
    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,正在使用方法sendIdea(Idea _idea)从类发送对象。并通过使用方法接收对象。(我相信你不必详细了解类)。客户端通过这种方法实际上在程序启动时收到了一些s,没有任何问题。但是,当我尝试通过此方法接收相同但略有更改的对象时,在类中该对象不会更改,不像在类中将通过方法发送的对象被正确更改。我尝试了大约5个小时来解决这个问题。我逐行检查了所有代码,没有发现任何结果。我很确定 writeObject 或 readObject 方法有问题。我试图澄清这条流和许多其他试验。我希望我能找到问题所在。下面是我程序中的一些代码IdeawriteObjectrcvIdea()readObject()IdeaIdeaIdeaClientServersendIdeaobjectOS.flush()

Client.class包ideaOcean;

import java.awt.HeadlessException;
import java.io.IOException;
import …
Run Code Online (Sandbox Code Playgroud)

java sockets objectoutputstream objectinputstream

3
推荐指数
1
解决办法
1314
查看次数