将二进制数据转换为对象的过程称为 反序列化,具体实现方式取决于所使用的编程语言和场景。以下是常见的方法和示例:
一、Java中的序列化与反序列化
使用`ObjectOutputStream`和`ObjectInputStream` 通过`ObjectOutputStream`将对象序列化为二进制数组,再通过`ObjectInputStream`反序列化回对象。需注意对象需实现`Serializable`接口。
```java
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("对象已序列化到person.ser");
} catch (IOException e) {
e.printStackTrace();
}
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("对象已反序列化: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
```
使用`pickle`模块(Python特有)
Python 提供`pickle`模块,支持将对象序列化为二进制文件或字符串,反序列化时直接使用`pickle.load()`或`pickle.loads()`。
```python
import pickle
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
序列化
person = Person("Alice", 30)
with open('person.pkl', 'wb') as f:
pickle.dump(person, f)
print("对象已序列化到person.pkl")
反序列化
with open('person.pkl', 'rb') as f:
deserialized_person = pickle.load(f)
print("对象已反序列化:", deserialized_person)
```
二、C中的序列化与反序列化
使用`BinaryFormatter`(不推荐)
C 提供`BinaryFormatter`类,但存在安全风险,建议优先使用`System.Text.Json`或`Newtonsoft.Json`。
```csharp
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public override string ToString() {
return $"Person(Name={Name}, Age={Age})";
}
}
class Program {
static void Main() {
Person person = new Person("Alice", 30);
using (FileStream fs = new FileStream("person.bin", FileMode.Create)) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, person);
Console.WriteLine("对象已序列化到person.bin");
}
using (FileStream fs = new FileStream("person.bin", FileMode.Open)) {
Person deserializedPerson = (Person) formatter.Deserialize(fs);
Console.WriteLine("对象已反序列化: " + deserializedPerson);
}
}
}
```
使用`System.Text.Json`(推荐)
`System.Text.Json`是现代C中更安全的序列化库。
```csharp
using System;
using System.IO;
using System.Text.Json;
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public override string ToString() {
return $"Person(Name={Name}, Age={Age})";
}
}
class Program {
static void Main() {
Person person = new Person("Alice", 30);
string jsonString = JsonSerializer.Serialize(person);
File.WriteAllText("person.json", jsonString);
Console.WriteLine("对象已序列化到person.json");
Person deserializedPerson = JsonSerializer.Deserialize Console.WriteLine("对象已反序列化: " + deserializedPerson); } } ``` 三、其他语言的序列化方式 Python: `pickle`(二进制文件)或`json`(文本格式) Node.js