我正在使用ObjectOutputStream来创建序列化对象的文件.然后我使用ObjectInputStream与readObject()方法一起从文件中取出对象.
它第一次很棒.这意味着如果文件不存在并且我打开它然后附加任意数量的对象,我可以打开ObjectInputStream对象并访问所有对象.
但是,如果我随后打开相同的文件(使用append选项)并添加更多对象,则ObjectInputStream对象将获取java.io.StreamCorruptedException:"无效的类型代码:AC"错误,其中新对象应该启动.
有没有其他人遇到这个?我甚至回到了Deitel书中的一些基本教科书示例,但仍然得到了同样的错误.
编辑:我发现了这一点 - 一旦关闭并在追加模式下重新打开,您可能不会附加到序列化流的末尾.写入似乎有效,但是当您稍后再读取该文件时,您将获得java.io.StreamCorruptedException.在" http://mindprod.com/jgloss/gotchas.html#SERIALIZATION "
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编写的网络应用程序,在套接字上使用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没有很多资源可以开始.当我进一步研究它时,我会更新这个问题.
所以现在,我有一个运行的服务器ObjectInputStream和ObjectOutputStream.
我遇到的问题是我有一个自定义(匿名)类,它扩展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
有时,我想使用an ObjectOutputStream来写文件或通过网络发送一些小图像.但是BufferedImage许多其他类没有实现java.io.Serializable,然后Stream取消了写入.有没有办法避免这种情况?
谢谢,Martijn
我读到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
我有这个可序列化的类,我用它来存储一个二进制文件的字符串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
我对此感到困惑。因为在实现 Serializable 类时,我们需要使用类似的类FileOutputStream,ObjectOutputStream或者类似的东西。那我们为什么不直接用这些类来做输出对象到文件、从文件输入对象这样的事情,直接维护对象的状态呢?为什么我们要先实现 Serializable 然后再做同样的事情?
java serialization objectoutputstream serializable fileoutputstream
在我的实验中,
如果服务器有这个:
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
我正在用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 ×10
sockets ×3
android ×1
class ×1
constructor ×1
flush ×1
io ×1
serializable ×1
thread-local ×1
utf-16 ×1