首页  > 教育解读  > 怎么将二进制转换为对象

怎么将二进制转换为对象

2025-05-02 12:31:53
李老师求职指导
李老师求职指导已认证

李老师求职指导为您分享以下优质知识

将二进制数据转换为对象的过程称为 反序列化,具体实现方式取决于所使用的编程语言和场景。以下是常见的方法和示例:

一、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

(jsonString);

Console.WriteLine("对象已反序列化: " + deserializedPerson);

}

}

```

三、其他语言的序列化方式

Python:

`pickle`(二进制文件)或`json`(文本格式)

Node.js