我是否遗漏了一些简单的序列化演示

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 配置或其他一些安全设置。