我是否遗漏了一些简单的序列化演示
Am I misssing something simple with Serialization demo
所以,我正在尝试在一个更高级的程序上实现序列化,但它没有用,所以我尝试了一个简单的测试,当我尝试写入我的 .ser 文件时,这仍然会出现“访问被拒绝”错误
主要CLASS
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class App implements Serializable {
public static void main(String[] args) throws Exception {
person p = new person("John", 30);
FileOutputStream fos = new FileOutputStream("person.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
fos.close();
}
}
CLASS 我想序列化
import java.io.Serializable;
public class person implements Serializable {
private String name;
private int age;
person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "helloworld";
}
}
错误信息
Exception in thread "main" java.io.IOException: Access is denied
at java.base/java.io.FileOutputStream.writeBytes(Native Method)
at java.base/java.io.FileOutputStream.write(FileOutputStream.java:347)
at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1891)
at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1800)
at java.base/java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:251)
at App.main(App.java:10)
这可能是一个非常简单的修复,但我完全不知所措。谢谢!
更新
我是 运行 Windows 11,文件在工作区目录 (Test\person.ser
) 中,java 文件在 Test\src\
目录中,并且根据 Visual Studio 代码默认值,它从 Test\bin\
目录开始。只读未选中,我已尝试 运行 作为管理员。
您的 Java 代码没有根本性的错误。当我在我的 (Linux) 机器上 运行 它时,它就可以正常工作。没有错误。 “person.ser”按预期在当前目录中创建。它 应该 在 Windows 上表现相同。
所以您的问题与您的计算机以及您 运行 编写 App
代码的方式有关。操作系统告诉您不允许写入该文件。
但这不仅仅是文件权限。当我(故意)使“person.ser”文件不可写时,我得到了与您不同的堆栈跟踪:
$ java App
Exception in thread "main" java.io.FileNotFoundException: person.ser (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at App.main(App.java:9)
注意打开文件时抛出异常。 这是我希望发生的事情。
但是在您的堆栈跟踪中,文件打开(用于写入)已成功,并且当您尝试将序列化 header 写入文件时发生“权限被拒绝”。
St运行ge。非常st运行ge.
我怀疑当前目录和/或它所在的文件系统有问题运行ge。它是在远程安装的共享上吗?它在可移动设备上吗?文件系统本身设置为 read-only 吗?它是一种不寻常的文件系统类型(例如,不是 NTFS)吗?您是否 运行 在具有某种会阻止某些写入的“强制访问控制”强化的系统上执行此操作?也许是过于激进的 anti-virus 应用程序?
当您 运行 代码是否在预期位置创建了一个空的“person.ser”文件?你能删除它并重试吗?这是可重复的吗?
你能写一个简单的程序,将“hello world”写入(比如)当前目录中名为“person.ser”的文本文件吗? 那个有效吗?
我刚刚在工厂擦除我的电脑,现在以前的代码可以工作了...我知道如果其他人偶然发现了这个,它可能是你的 JDK 配置或其他一些安全设置。
所以,我正在尝试在一个更高级的程序上实现序列化,但它没有用,所以我尝试了一个简单的测试,当我尝试写入我的 .ser 文件时,这仍然会出现“访问被拒绝”错误
主要CLASS
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class App implements Serializable {
public static void main(String[] args) throws Exception {
person p = new person("John", 30);
FileOutputStream fos = new FileOutputStream("person.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
fos.close();
}
}
CLASS 我想序列化
import java.io.Serializable;
public class person implements Serializable {
private String name;
private int age;
person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "helloworld";
}
}
错误信息
Exception in thread "main" java.io.IOException: Access is denied
at java.base/java.io.FileOutputStream.writeBytes(Native Method)
at java.base/java.io.FileOutputStream.write(FileOutputStream.java:347)
at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1891)
at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1800)
at java.base/java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:251)
at App.main(App.java:10)
这可能是一个非常简单的修复,但我完全不知所措。谢谢!
更新
我是 运行 Windows 11,文件在工作区目录 (Test\person.ser
) 中,java 文件在 Test\src\
目录中,并且根据 Visual Studio 代码默认值,它从 Test\bin\
目录开始。只读未选中,我已尝试 运行 作为管理员。
您的 Java 代码没有根本性的错误。当我在我的 (Linux) 机器上 运行 它时,它就可以正常工作。没有错误。 “person.ser”按预期在当前目录中创建。它 应该 在 Windows 上表现相同。
所以您的问题与您的计算机以及您 运行 编写 App
代码的方式有关。操作系统告诉您不允许写入该文件。
但这不仅仅是文件权限。当我(故意)使“person.ser”文件不可写时,我得到了与您不同的堆栈跟踪:
$ java App
Exception in thread "main" java.io.FileNotFoundException: person.ser (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at App.main(App.java:9)
注意打开文件时抛出异常。 这是我希望发生的事情。
但是在您的堆栈跟踪中,文件打开(用于写入)已成功,并且当您尝试将序列化 header 写入文件时发生“权限被拒绝”。
St运行ge。非常st运行ge.
我怀疑当前目录和/或它所在的文件系统有问题运行ge。它是在远程安装的共享上吗?它在可移动设备上吗?文件系统本身设置为 read-only 吗?它是一种不寻常的文件系统类型(例如,不是 NTFS)吗?您是否 运行 在具有某种会阻止某些写入的“强制访问控制”强化的系统上执行此操作?也许是过于激进的 anti-virus 应用程序?
当您 运行 代码是否在预期位置创建了一个空的“person.ser”文件?你能删除它并重试吗?这是可重复的吗?
你能写一个简单的程序,将“hello world”写入(比如)当前目录中名为“person.ser”的文本文件吗? 那个有效吗?
我刚刚在工厂擦除我的电脑,现在以前的代码可以工作了...我知道如果其他人偶然发现了这个,它可能是你的 JDK 配置或其他一些安全设置。