序列化与反序列化高级应用

java Fastjson高级应用:自定义序列化与反序列化的全面指南 在处理JSON数据时,我们经常需要对数据进行特定的格式化或处理,以满足业务需求。Fastjson作为Java中一个流行的JSON处理库,提供了丰富的扩展点,允许我们自定义序列化和反序列化的行为。本文将总结Fastjson中自定义序列化和反序列化的方法,帮助你更灵活地控制JSON数据的转换过程。@JSONField@JSONFieldFastjson提供了丰富的扩展点,包括和等,允许我们在序列化和反序列化过程中进行细粒度的控制。 阅读详情

在进行系统开发的时候序列化与反序列化在保存系统参数时可以有很大优势,比如不需要修改数据库增加字段直接修改实体就可以了,这一点对于上位机开发非常有帮助,因为上位机的电脑一般不联网,所以在上位机进行参数保存的时候建议使用序列化,但是运行参数不建议使用序列化,所谓的其实就是按照xml的方式将数据以流的方式存入数据库里面,当需要数据的时候反序列化成实体类。

1.创建可以保存流文件的表

#region 创建数据库
Dictionary<string,string> sqlDic=new Dictionary<string,string>();
string sql=string.empty;
sql+="Create table if not exists TestEntity(";
sql+="ID integer primary key autoincrement";//id设为主键
sql+=",obj blob";
sql+=");";
sqlDic.Add("Create TestEntity",sql);
#endregion

#region 插入参数表
sql="Insert into TestEntity(obj) values(";
sql+="@obj);";
sqlDic.Add("Insert TestEntity",sql);
#endregion

#region 更新参数表
sql="update TestEntity set obj=@obj ;";
sqlDic.Add("Update TestEntity",sql);
#endregion

#region 查询参数表
sql="select obj from TestEntity where ID=(select max(id) from TestEntity)";
sqlDic.Add("select TestEntity",sql);
#endregion

#region 删除参数表
sql="delete from TestEntity";
sqlDic.Add("Delete TestEntity",sql)
#endregion

2.创建类文件

[Serializable]
public class TestEntity
{
    public TestEntity()
    {
        parameter1="";
        parameter2="";
    }
    private string parameter1{set;get;}
    private string patameter2{set;get;}    
}

3.将数据序列化之后保存数据到数据库

//将一个List泛型序列化成字符串数组
public static void InsertTestEntity()
{
    List<TestEntity> listTestEntitys=new List<TestEntity> {{"Test1","Test2"},{"Test3","Test4"}};
    string sql=sqlDic["Insert TestEntity"];
    byte[] data=new byte[0];
    SerializeObjectToByte(listTestEntitys,out data);
    SaveOneBlob(sql,data);
}
//把一个实例序列化为字符串
public static bool SerializeObjectToByte(Object obj ,out byte[] serialize)
{
    bool flagSerial=false;
    try
    {
        MemoryStream memoryStream=new MemoryStream();
        BinaryFormatter binaryFormatter=new Binaryformatter();
        binaryFormatter.Serialize(memoryStream,obj);
        serialize=memoryStream.ToArray();
        flagSerial=true;
    }
    catch(Exception ex)
    {
        flagSerial=false;
        throw ex;
    }
    return flagSerial;
}

//comm是一个Command对象
//conn是一个Connectiond对象
//tran是一个Transaction对象
//保存blob对象
public static void SaveBlob(string sqlstr,byte[] buffer)
{
    try
    {
        openConnection();
        tran=conn.BeginTransaction(IsolationLevel.ReadCommitted);
        comm.Transaction=tran;
        comm.CommandType=CommandType.Text;
        comm.CommandTest=sqlstr;
        comm.Parameters.Add("@obj",System.Data.DbType.Binary,buffer.Length).Value=buffer;
        comm.ExecuteNonQuery();
        trans.Commit();
    }
    catch(Exception e)
    {
        throw new Exception(e.Message);
    }
    finally
    {
        closeConnection();
    }
}

4.从数据库读取流之后反序列化为实体泛型

public static void GetTextEntity()
{
    try
    {
        List<TextEntity> ListTestEntitys=new List<TextEntity>();
        string sql=sqlDic["Select TestEntity"];
        byte[] data=GetOleObj(sql);
        if(data!=null&&data.Length>0)
        {
            object obj=new object();
            DeserializeToObj(data,out obj);
            if(obj!=null)
            {
                ListTestEntitys=(List<TextEntity>)obj;
            }
        }
    }
    catch(Exception ex)
    {
        throw ex;
    }
}
//查询数据库,获取数据流,以字节数组的形式返回
public static byte[] GetOleObj(string sql)
{
    byte[] r=new byte[0];
    try
    {
        openConnection();
        comm.CommandType=CommandType.Text;
        comm.CommandText=sql;
        r=(byte[])comm.ExecuteScalar;
        if(r==null)
        {
            r=new byte[0];
        }
    }
    catch(Exception e)
    {
        throw ex;
    }
    finally
    {
     closeConnection();
    }
    return r;
}
//将字符流反序列化为实体类
public static bool DeserializeToObj(byte[] serialize,out object deserializedObj)
{
    bool deserializeOK=false;
    deserializedObj=null;
    try
    {
        MemoryStream restoreMemoryStream=new MemoryStream(serialize);
        BinaryFormatter binaryFormatter=new BinaryFormatter();
        deserializedObj=binaryFormatter.Deserialize(restoreMemoryStream);
        deserializeOK=true;
    }
    catch(Exception ex)
    {
        throw ex;
    }
    return  deserializedObj;
}

 

Java序列化与反序列化详解 序列化是指将对象的状态转换为字节流,以便能够将对象写入文件、数据库或者通过网络进行传输。序列化后的字节流可以重新创建对象,这一过程称为反序列化。如果需要自定义序列化过程,可以在类中定义和readObject方法。Java序列化与反序列化机制为对象的持久化和传输提供了方便和灵活的解决方案。通过实现接口,可以轻松地将对象序列化为字节流,并在需要时将其反序列化为对象。使用transient关键字、、自定义序列化方法以及接口,可以更细粒度地控制序列化过程。 阅读详情

相关推荐

C#中实现XML序列化和反序列化的详细指南

在XML中,属性(Attributes)和子元素(Elements)都有其特定的用途和上下文。属性通常用于提供有关元素的附加信息,而子元素则用于表示复杂信息或数据的嵌套结构。在C#中,使用时,可以通过类的字段和属性来控制哪些成员应被序列化为属性或子元素。在第四章,我们将深入探讨如何在C#中自定义序列化输出,以创建符合特定需求的XML格式。这个过程涉及对XmlWriter和等类的使用,以及如何在自定义操作中处理复杂的数据结构和性能优化。

weixin_42402664的博客 1622

序列化的作用及反序列化

一、序列化的定义 序列化就是将一个对象状态(各个属性量)保存起来,然后在适当的时间在获取 序列化分为:序列化和反序列化。 序列化是将数据分解成字节流,以便存储在文件中或在网络上传输。 反序列化就是打开字节流并重构对象。 二、序列化的特点 如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient...

m0_45230978的博客 1447

Kettle入门指南:从安装到数据转换实战

本文提供Kettle(Pentaho Data Integration)的完整入门指南,涵盖从Java环境安装、软件配置到核心概念(转换与作业)的详细解析。通过实战案例,手把手教你如何将文本文件数据导出到Excel,并连接MySQL数据库进行数据导入,帮助你快速掌握这一强大ETL工具的基本使用,实现高效数据搬运与转换。

weixin_29266647的博客 449

序列化和反序列化的概念及应用

1、序列化和反序列化的概念 序列化:把对象转换为字节序列的过程。 反序列化:把字节序列恢复为对象的过程称。 2、什么情况下需要序列化 把内存中的对象状态保存到一个文件中或者数据库中时候; 用套接字在网络上传送对象的时候; 通过RMI传输对象的时候; 3、如何实现序列化 实现Serializable接口即可 package com.cjian.ser; import java.io.Serializable; /** * @Author: cjian * @Date: 2022/2/2

cj_eryue的博客 1497

车联网ECU、TSP与TBOX通信流程

对比维度ECU(电子控制单元)BMS(电池管理系统)应用场景传统燃油车 + 新能源汽车仅限新能源汽车核心作用控制整车各系统运行管理动力电池安全与寿命车联网角色数据采集与传输的核心载体提供电池相关的核心数据。

tecoes的博客 1232

从零构建:如何用MATLAB工具箱打造你的第一个多体动力学仿真模型

本文详细介绍了如何使用MATLAB的Simscape Multibody工具箱从零开始构建多体动力学仿真模型,特别适合初学者学习倒立摆系统的建模与仿真。文章涵盖环境准备、坐标系设置、物理模型构建、参数化建模及性能优化等关键步骤,帮助工程师快速掌握这一强大的仿真工具。

water的专栏 964

理解Java对象序列化及其高级应用

原文链接:http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 理解Java对象序列化 1. 什么是Java对象序列化     Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可

xuehuagongzi000的博客 331

用LTspice仿真CMOS反相器功耗?这份避坑指南能省你3天调试时间

本文详细介绍了如何使用LTspice准确仿真CMOS反相器的功耗,包括动态功耗、短路功耗和静态功耗的测量技巧。通过工程实践指南,帮助电子工程师避开常见陷阱,优化仿真参数设置,提升仿真结果的可靠性,节省调试时间。

w7x8y9z的博客 188

C#中MemoryStream类的介绍

MemoryStream位于System.IO命名空间,为系统内存提供流式的读写操作。常作为其他流数据交换时的中间对象操作。 1、MemoryStream类封装一个字节数组,在构造实例时可以使用一个字节数组作为参数,但是数组的长度无法调整。使用默认无参数构造函数创建实例,可以使用Write方法写入,随着字节数据的写入,数组的大小自动调整。 2、在对MemoryStream类中数据流进行读取时,...

pan_junbiao的博客 4万+

WRF中使用ERA5再分析数据

   本人在做一些实例时,需要用到最新的ERA5再分析数据集,其中我下载的是ERA5 hourly data on pressure levels form 1979 to present和ERA5 hourly data on single levels from 1979 to present中的3天数据。 1、注册climate copernicus账号 下载ERA5数据前先要注册其账号 2、选择变量    WRF中对于气象数据的字段有具体的要求, ......

GIS 8169

PCIe(二) —— 配置空间

好了,这一篇我们把配置空间的结构,分配和访问,都大概总结了一遍,并且还介绍了它们的头部字段和这些字段的意义,包括BAR和消息路由的原理。之后,如果有时间,我们会继续来探索PCIe的数据报文的结构和传输等等。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1767

C# 使用MemeryStream进行序列化

微软文档中有写如何使用文件流FileStream对类进行序列化Serialize和反序列化Deserialize。 参考:基本序列化 [Serializable] public class MyObject { public int n1 = 0; public int n2 = 0; public String str = null; } 序列化过程: MyOb...

ShineRoyal 1152

利用SIMULINK搭建一个16QAM调制解调收发系统

1发送模块设计 根据前面介绍的理论知识,我们可以知道16QAM的基本结构,首先我来设计QAM发送段的SIMULINK仿真模块。 图1 16QAM的发送端模块 他的基本工作流程为:将信号通过两路升余弦滤波器,得到滤波以后的信号,滤波器的作用就是为了防止码间干扰。然后将滤波以后的信号和SIN,COS相乘得到调制信号,将调制 下面一一介绍每个模块的具体参数设置以及各个部分信号的波形图。 图2 产生随机数据的信号源 第一部分信号是产生一组随机的数字,作为信源,第二个模块将信号...

FPGA/MATLAB学习教程/源码/项目合作开发 4776

BlueCap高级应用:如何自定义Characteristic数据序列化与反序列化

BlueCap是一个强大的iOS Bluetooth LE框架,它为开发者提供了便捷的工具来处理蓝牙低功耗设备间的数据通信。其中,Characteristic数据的序列化与反序列化是实现设备间高效数据交换的关键环节。本文将详细介绍如何在BlueCap中自定义Characteristic数据的序列化与反序列化过程,帮助开发者轻松应对各种复杂的数据格式需求。 [![BlueCap框架logo](ht

gitblog_00595的博客 1011

数字图像处理 基于matlab、opencv计算图像的梯度方向和梯度幅值

图像可以被视为标量场(即二维函数)。通过微分将标量场转换为矢量场。梯度是一个向量,描述了在x或y方向上移动时,图像变化的速度。我们使用导数来回答这样的问题,图像梯度的大小告诉图像变化的速度,而梯度的方向告诉图像变化最快的方向。因为梯度有方向和大小,所以将这些信息编码为向量是很自然的。该向量的长度提供了梯度的大小,而其方向提供了梯度方向。因为梯度在每个位置可能不同,所以我们在每个图像位置用不同的向量来表示它。

学以致用 知行合一 3202

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JAVA高级应用之序列化与反序列化与IO流总结

缓冲流 序列化 反序列化 缓冲流 字节缓冲流 缓冲流(高效率的流) BufferedOutputStream 缓冲输出字节流 构造方法: BufferedOutPutStream(OutputStream out) 参数:字节输出流的父类 FileOutputStream 你想对哪个流高效 就把该流装进去 BufferedInputStream 缓冲输入字节流 代码示例

沙漠皇帝本拉登 287

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Java高级应用】对象序列化和反序列化

为什么80%的码农都做不了架构师?>>> ...

weixin_34268610的博客 133

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java序列化与反序列化

反序列化是将字节序列重新转换为Java对象的过程。这个过程允许我们在不同的JVM实例或不同的时间点重建对象的状态。比如从数据库中读取序列化的用户偏好设置时,就需要进行反序列化。// 自定义序列化逻辑// 调用默认序列化// 额外序列化操作// 自定义反序列化逻辑// 调用默认反序列化// 额外反序列化操作。

Made In SQL 749

【Java第109集】java序列化与反序列化实现原理详解

方法如果类定义了方法,会反射调用该方法。用途:自定义字段的序列化逻辑(如加密敏感字段)。示例:private void writeObject(ObjectOutputStream out) throws IOException {// 调用默认序列化逻辑// 自定义字段加密方法如果类定义了方法,会反射调用该方法。用途:自定义字段的反序列化逻辑(如解密敏感字段)。

学不可以已,活到老,学到老。 817

Python 对象序列化神器 ——pickle 深度剖析

序列化,简单来说,就是把 Python 中的各种复杂对象(像列表、字典、自定义类的实例等)转化成一种可以存储或传输的格式,这个过程就好比把一堆物品打包整理,方便搬运和存放。而反序列化则是反向操作,将存储或传输的数据还原成原来的对象,如同打开包裹,取出里面的物品并恢复原样。pickle模块在 Python 中专门负责这两项操作,“pickling” 指的是序列化,“unpickling” 就是反序列化。当不够灵活时,可子类化Pickler类并实现方法,基于对象类型以外的规则定制封存。pickle。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 2037

JavaScript实践(三)JavaScript序列化与反序列化深度解析

JavaScript中的序列化与反序列化是数据存储、网络传输和跨系统交互的关键技术。序列化将对象转换为JSON字符串,用于数据持久化、网络通信和状态管理;反序列化则将字符串还原为对象。

致力于硬件设计、人工智能知识及技术的分享,不断鞭策自己成长,共同进步! 1906

XML序列化与反序列化 整理文档

XML序列化与反序列化     // OBJECT -> XML     public static void SaveXml(string filePath, object obj) { SaveXml(filePath, obj, obj.GetType()); }     public static void SaveXml(string filePath, object obj, S

小草旁的大树 500

java序列化与反序列化进阶(一)

一、readObject和writeObject 通过上个章节的Java序列化与反序列化入门理解,对序列化和反序列化应该有了比较基本的认识。回顾一下,之前的序列化和反序列化,只是简单的处理,如果需要二次加工需要如何处理?比如序列化的时候需要对数据进行加密操作,对应的反序列化时候需要进...

156

PHP反序列化

前置知识。

2402_87833971的博客 662

Python高级应用系列(十九)数据序列化与反序列化:pickle、json、msgpack、protobuf:四种主流序列化方案的核心特性和适用场景

本文系统对比了Python中四种主流序列化方案的核心特性和适用场景。pickle作为Python原生序列化工具,支持任意Python对象且性能最优,但存在安全风险,仅推荐用于可信环境下的进程间通信。JSON作为跨语言通用格式,在API响应和配置文件中表现优异,具有极佳的可读性和兼容性。msgpack凭借二进制编码在缓存和消息队列场景中展现出体积小、速度快的优势。protobuf则通过schema驱动和变长编码,成为微服务通信和大数据存储的理想选择。文章通过性能基准测试验证了各方案的效率差异,并提出了分层架构

weitingfu的博客 396

Day050: pickle 模块:对象的序列化与反序列化

在 Python 编程中,对象的序列化和反序列化是一个常见的需求,特别是在需要将对象存储到文件、传输网络或者在不同的程序之间共享对象时。pickle 模块是 Python 标准库中用于对象序列化和反序列化的强大工具,能够将 Python 对象转换为字节流,以便存储或传输,并在需要时将字节流还原为 Python 对象。熟练掌握 pickle 模块的使用,对于 Python 开发者来说是非常重要的。

u014481728的博客 1562
上一篇: 论印度为什么软件行业这么发达(搞笑篇)
下一篇: winform实现控件透明(实现真透明)
奇点码农
博客等级 码龄19年 60粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值