Java,C#使用二进制序列化、反序列化操作数据

Java、C#使用二进制序列化、反序列化操作数据

在Java和C#中,我们可以使用二进制序列化和反序列化来存储和读取对象数据。二进制序列化就是将对象转化为二进制字节流的过程,反序列化则是将二进制字节流转化为对象的过程。在网络传输或者本地存储中,使用二进制序列化和反序列化可以方便的进行数据传输和存储。

Java操作示例

序列化

使用Java中的ObjectOutputStream可以将对象转化为二进制字节流。例如,我们定义一个Student类:

import java.io.Serializable;

public class Student implements Serializable {
    private String name;
    private int age;
    private String hobby;

    public Student(String name, int age, String hobby) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getHobby() {
        return hobby;
    }
}

我们可以将一个Student对象序列化为二进制字节流:

import java.io.*;

public class SerializationDemo {
    public static void main(String[] args) throws IOException {
        Student student = new Student("Jack", 18, "Swimming");
        FileOutputStream fos = new FileOutputStream("student.bin");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(student);
        oos.close();
    }
}

反序列化

使用Java中的ObjectInputStream可以将二进制字节流转化为对象。例如,我们将上面序列化的二进制字节流反序列化为一个Student对象:

import java.io.*;

public class DeserializationDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream("student.bin");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Student student = (Student) ois.readObject();
        ois.close();
        System.out.println(student.getName());
        System.out.println(student.getAge());
        System.out.println(student.getHobby());
    }
}

C#操作示例

序列化

使用C#中的BinaryFormatter可以将对象转化为二进制字节流。例如,我们定义一个Student类:

[Serializable]
public class Student {
    public string Name { get; set; }
    public int Age { get; set; }
    public string Hobby { get; set; }

    public Student(string name, int age, string hobby) {
        this.Name = name;
        this.Age = age;
        this.Hobby = hobby;
    }
}

我们可以将一个Student对象序列化为二进制字节流:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

class SerializationDemo {
    static void Main(string[] args) {
        Student student = new Student("Jack", 18, "Swimming");
        MemoryStream stream = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, student);
    }
}

反序列化

使用C#中的BinaryFormatter可以将二进制字节流转化为对象。例如,我们将上面序列化的二进制字节流反序列化为一个Student对象:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

class DeserializationDemo {
    static void Main(string[] args) {
        MemoryStream stream = ...; // 上面序列化的MemoryStream
        BinaryFormatter formatter = new BinaryFormatter();
        stream.Seek(0, SeekOrigin.Begin);
        Student student = (Student) formatter.Deserialize(stream);
        Console.WriteLine(student.Name);
        Console.WriteLine(student.Age);
        Console.WriteLine(student.Hobby);
    }
}

注意事项

  1. 序列化的对象必须实现Serializable接口(Java)或标记[Serializable]属性(C#)。
  2. 序列化和反序列化的过程中,需要使用相同的序列化器。因此,序列化后的二进制字节流需要同时保存序列化器的一些元数据,以便反序列化时使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java,C#使用二进制序列化、反序列化操作数据 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • SimpleAdmin手摸手教学之:插件管理

    一、前言 在2.0的架构设计中,引入了插件的概念,目的就是为了解决代码臃肿问题,随着系统功能越来越多,System层的代码也越来越多,之前是以文件夹的方式区分功能模块,这样的话代码就过于集中,想找到某一个功能模块的代码就要翻好几个文件夹,不利于以后的开发和维护。所以在新的架构中,我将部分功能模块通过插件的方式提取出来,封装成类库形式的插件,这样System层…

    C# 2023年4月18日
    00
  • C#使用Http Post方式传递Json数据字符串调用Web Service

    下面提供详细的攻略: 使用HttpPost方式传递Json数据字符串调用WebService 1. 前言 在使用C#调用WebService时,我们常常使用WebReference工具来生成WebService代理类,然后通过调用代理类中的方法实现与WebService服务的交互。但直接调用方法传递参数时,仅支持基本数据类型、字符串等传输,无法传递复杂对象。…

    C# 2023年5月15日
    00
  • c# 怎样简洁高效的实现多个 Enum 自由转换

    C#怎样简洁高效的实现多个Enum自由转换 在C#中,Enum是一种常用的数据类型,它可以用于定义一组常量。在实际开发中,我们经常需要将不同的Enum类型进行转换,以便在不同的上下文中使用。本文将介绍如何使用C#实现多个Enum自由转换,并提供两个示例来演示如何使用这些技术。 示例1:使用扩展方法实现Enum转换 以下是使用扩展方法实现Enum转换的步骤: …

    C# 2023年5月15日
    00
  • c# AES字节数组加密解密流程及代码实现

    下面是详细讲解“c# AES字节数组加密解密流程及代码实现”的攻略。 AES加密解密介绍 AES全称为Advanced Encryption Standard,高级加密标准,是一种对称加密算法。AES加密算法是美国超过15家组织共同研究的结果。其加密强度、安全性都很高,因此这种加密算法被广泛使用,如SSL/TLS协议加密、密码学中等等。 AES算法的加密和解…

    C# 2023年6月6日
    00
  • C#更新SQLServer中TimeStamp字段(时间戳)的方法

    一、概述 TimeStamp字段也叫RowVersion字段,它的存储空间为8个字节,用来表示某一条记录的版本号,取值范围在datetime2类型的范围内,但它不是一个日期时间字段,也不是一个自增长字段,是Sql Server自有的一种数据类型。 在更新数据库表的时候,我们经常要更新TimeStamp字段,下面是C#更新SQLServer中TimeStamp…

    C# 2023年5月31日
    00
  • ASP.Net Core中的内存和GC机制

    ASP.NET Core中的内存和GC机制 在本攻略中,我们将深入了解ASP.NET Core中的内存和GC机制。我们将介绍.NET Core内存管理的基本原理、GC机制的工作原理和使用方法,并提供两个示例说明。 .NET Core内存管理的基本原理 .NET Core内存管理的基本原理是将内存分为两个部分:托管堆和非托管堆。托管堆是由.NET运行时管理的内…

    C# 2023年5月16日
    00
  • 聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题 1. 接口究竟是什么? 在C#中,接口(interface)是一种定义了一组方法、属性和事件的规范 (specification),但没有提供实现代码的一种类型。接口可以被类或结构(struct)实现,实现接口的类或结构需要实现接口中定义的所有成员,并且成员的访问级别不能低于接口的访问级别。 2. 接口的作用 接口主要有以下两个作用: 定…

    C# 2023年6月6日
    00
  • C#条码生成及打印实例代码

    下面就为大家介绍一下“C#条码生成及打印实例代码”的完整攻略,包含以下几个步骤: 步骤1:了解条码生成原理 在了解具体的生成实现之前,我们需要先了解一下条码生成的基本原理和常用的编码方式。常用的编码方式包括Code39、Code128、EAN13等多种类型,每种类型的编码方式也不尽相同。 步骤2:引用条码生成库 在C#编程中,我们可以引用一些常用的条码生成库…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部