把一个对象序列化为字符串,再反序列化回来

盒子论坛有人问如何把一个 TImage 的序列化后的字符串变成一个 TImage.

那么,首先我们来看看这个字符串是怎么来的,那就是:

如何把一个对象比如 Image1: TImage 序列化为字符串

看代码:

//序列化
function   ComponentToString(Component:   TComponent): string;
var
  BinStream:TMemoryStream;
  StrStream:   TStringStream;
  s:   string;
begin
  BinStream   :=   TMemoryStream.Create;
  try
    StrStream   :=   TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0,   soFromBeginning);
      ObjectBinaryToText(BinStream,   StrStream);
      StrStream.Seek(0,   soFromBeginning);
      Result:=   StrStream.DataString;
    finally
      StrStream.Free;
    end;
  finally
    BinStream.Free
  end;
end;

假设 Form1 上面我有一个 Image12,并且加载了图片,然后,

调用上述代码:

procedure TForm5.Button4Click(Sender: TObject);
var
  S: string;
begin
  S := ComponentToString(Image12);

  Memo1.Lines.Text := S;
end;

获得的结果显示到 Memo1 里面了,如下:

object Image12: TImage
  Left = 488
  Top = 40
  Width = 105
  Height = 105
  Picture.Data = {
    0A544A504547496D6167654E1E0000FFD8FFE000104A46494600010101004800
    480000FFE100C04578696600004D4D002A000000080006011A00050000000100
    000056011B0005000000010000005E0128000300000001000200000131000200
    0000110000006601320002000000140000007887690004000000010000008C00
    000000000000480000000100000048000000017061696E742E6E657420352E30
    2E31330000323030393A30323A31392031313A30353A3432000003A001000300
    00000100010000A00200040000000100000270A003000400000001000001A900
    0000000000FFE107E9687474703A2F2F6E732E61646F62652E636F6D2F786170
    2F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D22
    57354D304D7043656869487A7265537A4E54637A6B633964223F3E0D0A3C783A
    786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F22
    20783A786D70746B3D2241646F626520584D5020436F726520342E312D633033
    362034362E3237363732302C204D6F6E2046656220313920323030372032323A
    34303A30382020202020202020223E0D0A20203C7264663A52444620786D6C6E
    733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F3032
    2F32322D7264662D73796E7461782D6E7323223E0D0A202020203C7264663A44
    65736372697074696F6E207264663A61626F75743D222220786D6C6E733A6463
    3D22687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E
    312F2220786D6C6E733A7861703D22687474703A2F2F6E732E61646F62652E63
    6F6D2F7861702F312E302F2220786D6C6E733A7861704D4D3D22687474703A2F
    2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E73
    3A73745265663D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F
    E41EBD4E4D15D1868C6F7B0E2DCB591F3D4B79AB3F882DE1D43529AE99409373
    392C016C753D4FE028AF739525748F3A3567CAF534F47D2AF75FB51ACEB3A9C9
    F62572A96D6D88CB727EF10063F0A2B96B4DC748E87651F7BE2361F53B3B4454
    D2F4E8ACE123EE040C4907BB1058FE268AE75152D65A972935A23FFFD9}
end

说明:以上序列化出来的字符串,我把图片二进制数据部分删除了很多,只保留了一部分,仅仅为了说明里面的字符串实际上是 HEX 数据。如果都保留,篇幅太大了。

如何把字符串反序列化为对象

上面序列化出来的字符串,如何使用代码,在运行期,加载字符串,变成一个 TImage 对象,并且呈现在界面上?

反序列化的代码:

//测试 TComponent 反序列化
function StringToComponent(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream:   TMemoryStream;
begin
  RegisterClass(TImage);  //没有这个,会提示:Class TImage not found
  StrStream   :=   TStringStream.Create(Value);
  try
    BinStream   :=   TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream,   BinStream);
      BinStream.Seek(0,   soFromBeginning);
      Result   :=   BinStream.ReadComponent(nil);
    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;

调用上述函数,把 Image 从字符串反序列化回来,显示到一个 Panel1 上面:

procedure TForm5.Button3Click(Sender: TObject);
var
  AComponent: TComponent;
  S: string;
begin
  S := Memo1.Lines.Text;
  AComponent := StringToComponent(S);

  if (AComponent is TImage) then
  begin
    TImage(AComponent).Parent := Panel1;
    TImage(AComponent).Align := alClient;
  end;
end;

上述代码,在 Delphi 11 CE 版本上测试通过。

一个说明:

上述代码中,函数:StringToComponent 负责把字符串变成一个 TComponent 的对象,其中实际完成这个动作的代码是:BinStream.ReadComponent(nil);

但是,执行这一行,会有异常提示:Class TImage not found.

解决这个异常的办法就是,在执行这行代码之前,先注册 TImage:

RegisterClass(TImage);

当然,要在程序里面使用 TImage 还必须引用:Vcl.ExtCtrls

但是,仅仅是引用 Vcl.ExtCtrls 并不会使得 Class TImage not found 这个异常消失。

本文结束。

觉得本文有用的,点个赞吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918687.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C指针之舞——指针探秘之旅

❤博客主页:折枝寄北-CSDN博客 ❤专栏内容:C语言学习专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.3001.5482 指针基础学习 在之前的博客文章中,简单总结了指针的基础概念 我们知道了指针的概念&#xf…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

Spring Cloud微服务下如何配置I8n

什么是I8n 国际化(I18n)指的是设计和开发产品的过程,使得它们能够适应多种语言和文化环境,而不需要进行大量的代码更改。这通常涉及到创建一个基础版本的产品,然后通过配置和资源文件来添加对不同语言和地区的支持。 这…

将分割标签数据从JSON格式转换为YOLOv8的TXT格式

AnyLabeling是一款突破性的开源图像标注工具。 一、主要功能与特点 融合传统标注工具优点:AnyLabeling结合了LabelImg和Labelme等传统标注软件的优点,提供了多边形、矩形、圆形、线条和点等多种标注形式,满足不同场景的需求。强大的AI自动标…

【graphics】图形绘制 C++

众所周知,周知所众,图形绘制对于竞赛学僧毫无用处,所以这个文章,专门对相关人员教学(成长中的码农、高中僧、大学僧)。 他人经验教学参考https://blog.csdn.net/qq_46107892/article/details/133386358?o…

Javaweb梳理17——HTMLCSS简介

Javaweb梳理17——HTML&CSS简介 17 HTML&CSS简介17.1 HTML介绍17.2 快速入门17.3 基础标签17.3 .1 标题标签17.3.2 hr标签17.3.3 字体标签17.3.4 换行17.3.8 案例17.3.9 图片、音频、视频标签17.3.10 超链接标签17.3.11 列表标签17.3.12 表格标签17.3.11 布局标签17.3.…

637. 二叉树的层平均值【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 637. 二叉树的层平均值 一、题目描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 二、测试用例 示例 1&a…

selenium元素定位---元素点击交互异常解决方法

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、异常原因 在编写ui自动化时,执行报错元素无法点击:ElementClickInterceptedException 具体报错:selenium.common.exc…

ARM64环境部署EFK8.15.3收集K8S集群容器日志

环境规划 主机IP系统部署方式ES版本CPU架构用户名密码192.168.1.225Ubuntu 22.04.4 LTSdockerelasticsearch:8.15.3ARM64elasticllodyi4TMmZD ES集群部署 创建持久化目录(所有节点) mkdir -p /data/es/{data,certs,logs,plugins} mkdir -p /data/es/certs/{ca,es01}服务器…

搭建MC服务器

局域网中玩MC,直接自己创建房间开启局域网就可以了。如果想开一个24小时不关机的服务器呢?其实最开始我是想在windows云服务器,图形化界面运行一个开启局域网即可。可能是云服务器上没有显卡,还是其他什么原因,游戏打开…

数据结构-二叉搜索树(Java语言)

目录 1.概念 2.查找search 3.插入insert ​编辑4.删除remove(难点) 5.性能分析 1.概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 : 1.若它的左子树不为空,则左子树上所有节点的值都…

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后,全面转型新质课程规划,传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代,电气时代,信息时代;主要生产力-人力转为人脑&…

【Pikachu】PHP反序列化RCE实战

痛是你活着的证明 1.PHP反序列化概述 在理解 PHP 中 serialize() 和 unserialize() 这两个函数的工作原理之前,我们需要先了解它们各自的功能及其潜在的安全隐患。接下来,我会对相关概念做更详细的扩展解释。 1. 序列化 serialize() 序列化&#xff…

Stable Diffusion概要讲解

🌺系列文章推荐🌺 扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新&…

免费开源!DBdoctor推出开源版系统诊断工具systool

​前言 在开发和运维过程中,经常会遇到难以定位的应用问题,我们通常需要借助Linux系统资源监控工具来辅助诊断。然而,系统的IO、网络、CPU使用率以及文件句柄等信息通常需要通过多个独立的命令工具来获取。在没有部署如Prometheus这样的综合…

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问,到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列(蛋白质、有机物、rna、dna、mrna)的多模态…

FPGA开发流程

注:开发板:小梅哥的ACX720。本实验可直接运行在小梅哥的ACX720开发板上,后续的实验都可直接运行在小梅哥的ACX720上。 一、打开VIVADO并创建工程 1、双击VIVADO图标,打开vivado。 2、打开vivado界面打,点击有 Create …

【深度学习】wsl-ubuntu深度学习基本配置

配置pip镜像源 这里注意一点,你换了源之后就最好不要开代理了,要不然搞不好下载失败,pip和conda都是 ## 配置中科大镜像 pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple# 配置阿里源 pip config set global…

基于Cnn神经网络虫害预测

【摘 要】鉴于农业病虫害经济损失的预测具有较强的复杂性和非线性特性,设计了一种新型的GRNN预测模型,对农业病虫害经济损失进行预测。该模型基于人工神经网络捕捉非线性变化独特的优越性,在神经网络技术和江苏省气象局提供的数据的基础上&am…

【AI图像生成网站Golang】项目介绍

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 简介 本教程将手把手教你如何从零开始构建一个简单的AI图像生成网站。网站主要包含用户注册、图像生成、分类管理等…