序列流练习题相关内容

、定义一个访客类,属性有ID、时间。该类可以序列化。创建5个访客对象放在数组中,将对象放在object.dat文件中。并从文件中读出5个对象显示到屏幕上


import java.io.Serializable;

public class Visitor implements Serializable {
    private int ID;
    private String time;

    public Visitor(int ID, String time) {
        this.ID = ID;
        this.time = time;
    }

    public int getID() {
        return ID;
    }

    public String getTime() {
        return time;
    }
}

import java.io.*;

public class Main {
    public static void main(String[] args) {
        Visitor[] visitors = new Visitor[5];
        visitors[0] = new Visitor(1, "09:00");
        visitors[1] = new Visitor(2, "10:30");
        visitors[2] = new Visitor(3, "12:15");
        visitors[3] = new Visitor(4, "14:45");
        visitors[4] = new Visitor(5, "16:20");

        try {
            ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object.dat"));
            outputStream.writeObject(visitors);
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


import java.io.*;

public class Main {
    public static void main(String[] args) {
        try {
            ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.dat"));
            Visitor[] visitors = (Visitor[]) inputStream.readObject();

            for (Visitor visitor : visitors) {
                System.out.println("Visitor ID: " + visitor.getID());
                System.out.println("Time: " + visitor.getTime());
                System.out.println("-----------------------");
            }

            inputStream.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Python实现

import pickle

class Visitor:
    def __init__(self, id, time):
        self.id = id
        self.time = time

    def __str__(self):
        return f"ID: {self.id}, Time: {self.time}"

# 创建5个访客对象
visitors = [
    Visitor(1, "2022-01-01 10:00:00"),
    Visitor(2, "2022-01-01 11:00:00"),
    Visitor(3, "2022-01-01 12:00:00"),
    Visitor(4, "2022-01-01 13:00:00"),
    Visitor(5, "2022-01-01 14:00:00")
]

# 将对象序列化并保存到文件中
with open("object.dat", "wb") as f:
    for visitor in visitors:
        pickle.dump(visitor, f)

# 从文件中读取对象并显示到屏幕上
with open("object.dat", "rb") as f:
    for i in range(5):
        visitor = pickle.load(f)
        print(visitor)

首先定义了一个访客类Visitor,包含属性ID和time,以及一个__str__方法用于返回对象的字符串表示。然后创建了5个访客对象,将它们序列化并保存到文件object.dat中。最后从文件中读取对象并显示到屏幕上。

Java实现

import java.io.*;

class Visitor implements Serializable {
    private int id;
    private String time;

    public Visitor(int id, String time) {
        this.id = id;
        this.time = time;
    }

    public String toString() {
        return "ID: " + id + ", Time: " + time;
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建5个访客对象
        Visitor[] visitors = {
            new Visitor(1, "2022-01-01 10:00:00"),
            new Visitor(2, "2022-01-01 11:00:00"),
            new Visitor(3, "2022-01-01 12:00:00"),
            new Visitor(4, "2022-01-01 13:00:00"),
            new Visitor(5, "2022-01-01 14:00:00")
        };

        // 将对象序列化并保存到文件中
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"))) {
            for (Visitor visitor : visitors) {
                oos.writeObject(visitor);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 从文件中读取对象并显示到屏幕上
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"))) {
            for (int i = 0; i < 5; i++) {
                Visitor visitor = (Visitor) ois.readObject();
                System.out.println(visitor);
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

首先定义了一个访客类Visitor,实现了Serializable接口,以便对象可以序列化。然后创建了5个访客对象,将它们序列化并保存到文件object.dat中。最后从文件中读取对象并显示到屏幕上。注意在try-with-resources语句中使用ObjectOutputStream和ObjectInputStream来序列化和反序列化对象。

C++实现

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class Visitor {
public:
    Visitor(int id, const string& time) : id(id), time(time) {}
    string toString() const {
        return "ID: " + to_string(id) + ", Time: " + time;
    }
private:
    int id;
    string time;
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & id;
        ar & time;
    }
};

int main() {
    // 创建5个访客对象
    Visitor visitors[] = {
        Visitor(1, "2022-01-01 10:00:00"),
        Visitor(2, "2022-01-01 11:00:00"),
        Visitor(3, "2022-01-01 12:00:00"),
        Visitor(4, "2022-01-01 13:00:00"),
        Visitor(5, "2022-01-01 14:00:00")
    };

    // 将对象序列化并保存到文件中
    ofstream ofs("object.dat", ios::binary);
    boost::archive::binary_oarchive oa(ofs);
    for (const auto& visitor : visitors) {
        oa << visitor;
    }

    // 从文件中读取对象并显示到屏幕上
    ifstream ifs("object.dat", ios::binary);
    boost::archive::binary_iarchive ia(ifs);
    for (int i = 0; i < 5; i++) {
        Visitor visitor(0, "");
        ia >> visitor;
        cout << visitor.toString() << endl;
    }

    return 0;
}

首先定义了一个访客类Visitor,包含属性ID和time,以及一个toString方法用于返回对象的字符串表示。为了使类可以序列化,使用了Boost库的serialization模块,并在类中定义了serialize方法。然后创建了5个访客对象,将它们序列化并保存到文件object.dat中。最后从文件中读取对象并显示到屏幕上。注意使用了ofstream和ifstream来创建文件流,以及boost::archive::binary_oarchive和boost::archive::binary_iarchive来序列化和反序列化对象。

如有帮助望采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^