一、序列化与反序列化

序列化 是将一个对象转换为一种特定的格式或字符串表示,以便可以在不同的系统或程序之间进行传输或存储。 序列化 通常涉及将一个对象的属性值编码为字节流或字符流,并将其写入文件、网络流或其他媒介中。 序列化 后的数据可以在需要时进行 反序列化 ,以便重新创建原始的对象。

反序列化 是将 序列化 后的数据还原回原始对象的过程,即将 序列化 后的数据重新解码为原始对象的属性值。它通常涉及从文件、网络流或其他媒介中读取 序列化 的数据,并将其解码为原始对象。

序列化 反序列化 通常用于网络通信和数据存储等场景。例如,在Web应用程序中,当客户端向服务器发送请求时,客户端通常会将请求的参数 序列化 为JSON或XML格式,并将其作为HTTP请求的正文发送到服务器。服务器收到这些数据后,会对它们进行 反序列化 ,以便能够正确解析请求参数并执行相应的操作。

二、反射机制

反射机制是一种在运行时动态地获取类型信息、访问对象属性和调用对象方法的机制。在程序运行时,可以通过反射机制获取到类的名称、方法、属性等信息,并且可以动态地创建对象、调用方法和修改属性。这种机制通常用于开发框架、插件系统和代码生成器等应用程序中。

在Java和C#等面向对象编程语言中,反射机制被广泛使用。例如,在Java中,可以使用反射机制获取一个类的Class对象,并通过该对象获取类的构造函数、属性和方法等信息。在C#中,可以使用反射机制获取一个类型的Type对象,并通过该对象获取类型的成员和属性等信息。

在C++中,由于缺乏内置的反射机制,xml对象 序列化 反序列化 较为麻烦,原生并不支持。

三、序列化实现

本文基于 C++ tinyxml2 库实现了XmlSerializer对象的封装。通过调用Serialize和Deserialize函数,可以方便地进行xml对象的 序列化 反序列化 操作。支持对象嵌套、数组对象等复杂结构。

以Student对象为例,通过调用相应的接口,可以实现对Student对象的 序列化 反序列化 操作。Student对象包含了Grade对象数组,因此在进行 序列化 反序列化 时会涉及到整个Student及其成员的处理。

#include "XmlSerializer.h"
class Grade {
public:
    std::string courseName;
    std::string teacherName;
    int score;
    void toXml(XMLElement* elem) const {
        XmlSerializer::writeElement(elem, "CourseName", courseName);
        XmlSerializer::writeElement(elem, "TeacherName", teacherName);
        XmlSerializer::writeElement(elem, "Score", score);
    void fromXml(XMLElement* elem) {
        XmlSerializer::readElement(elem, "CourseName", courseName);
        XmlSerializer::readElement(elem, "TeacherName", teacherName);
        XmlSerializer::readElement(elem, "Score", score);
class Student {
public:
    std::string name;
    int id;
    std::vector<Grade> grades;
    void toXml(XMLElement* elem) const {
        XmlSerializer::writeElement(elem, "Name", name);
        XmlSerializer::writeElement(elem, "Id", id);
        XmlSerializer::writeElementArray(elem, "Grades", grades);
    void fromXml(XMLElement* elem) {
        XmlSerializer::readElement(elem, "Name", name);
        XmlSerializer::readElement(elem, "Id", id);
        XmlSerializer::readElementArray(elem, "Grades", grades);
std::string GetXmlString()
    return "<Root><Name>zcc</Name><Id>4078</Id><Grades><Item><CourseName>Math</CourseName><TeacherName>bo.wang</TeacherName><Score>95</Score></Item><Item><CourseName>Physics</CourseName><TeacherName>dingtai.tang</TeacherName><Score>100</Score></Item></Grades></Root>";
    /*XML文件格式
        <Name>zcc</Name>
        <Id>4078</Id>
        <Grades>
                <CourseName>Math</CourseName>
                <TeacherName>bo.wang</TeacherName>
                <Score>95</Score>
            </Item>
                <CourseName>Physics</CourseName>
                <TeacherName>dingtai.tang</TeacherName>
                <Score>100</Score>
            </Item>
        </Grades>
    </Root>
void PrintStudentObject(const Student& student)
    std::cout << "====================print student object start====================" << std::endl;
    std::cout << "Deserialized Student:" << std::endl;
    std::cout << "Name: " << student.name << std::endl;
    std::cout << "ID: " << student.id << std::endl;
    std::cout << "Grades:" << std::endl;
    for (const Grade& grade : student.grades) {
        std::cout << "Course Name: " << grade.courseName << std::endl;
        std::cout << "Teacher Name: " << grade.teacherName << std::endl;
        std::cout << "Score: " << grade.score << std::endl;
        std::cout << std::endl;
    std::cout << "====================print student object end======================" << std::endl;
void PrintXmlString(const std::string& xml)
    std::cout << "====================print xml string start========================" << std::endl;
    std::cout << xml << std::endl;
    std::cout << "====================print xml string end==========================" << std::endl;
void main() {
    //执行反序列化
    Student student;
    XmlSerializer::Deserialize(GetXmlString(), student);
    //遍历输出Student对象
    PrintStudentObject(student);
    //任意修改对象属性,以id为例
    student.id = 363258;
    //执行序列化
    std::string xml = XmlSerializer::Serialize(student);
    //输出序列化结果
    PrintXmlString(xml);
    std::cin.get();

四、输出结果
xml对象序列化与反序列化

五、工程获取

【点击下载】github: XmlSerialize

如有任何疑问,请在评论区留言。

转载须经作者同意,且必须注明原作者及原文出处。任何未经授权的转载、摘编或使用本文内容,将依法追究其法律责任。

在工作中经常会碰到XML序列化反序列化的问题,下面这个例子简单的介绍了C#中如何进行这两种操作。接下来我会先将XML文件中的内容转化成string类型,然后反序列化成一个对象,最后再将该对象序列化输出到屏幕上。1.首先先新建一个XML文件方便读取XML数据:&lt;?xml version="1.0" encoding="utf-8" ?&gt; &lt;Info&gt; &lt;User ... XML文件的妙用在于它的可扩展性和自描述性。通过XML文件,程序配置和数据交换能够更加灵活和直观。在C++中,借助TinyXML2等库,操作XML文件也变得非常简单和高效。     序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。     .NET框架提供了两种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用SoapFormatter进行串行化;3、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某... Cereal 的 GitHub 地址 具体怎么配置就不说了,就是一堆头文件 ???? ,拖到项目里就行。 // Test_Console_3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 #include <iostream> #include <Windows.h> #include <ce... 它在此过程中,先将对象的公共字段和私有字段以及类的名称(包含类所在的程序集)转换为字节流,然后再把字节流写入数据流。basic_binary、basic_text、basic_xml、binary_oarchive、polymorphic_iarchive、text_iarchive、xml_iarchive这几种。可用于数据序列化反序列化。(2)Boost.Serialization能够创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者实用户自己定义的其它文件。 刺瞎我的狗眼!!!听说C#有一个功能,能自动将一个struct的对象序列化xml,也能将xml反序列化成对应的struct对象C++木有,好吧,我承认,C++木有的东西还很多。。。。。。把struct序列化xml有虾米好处呢?想了半天,想到的我都用不上,唯一的好处,打发最近无聊的时间。时间有限,不能整复杂了,免得收不了场,一切从简。比如有struct定义如下:struct Test{    int nItem;    bool bItem;}这样一个最基本的struct定义,序列化xml,基本效果应 int _property_int; std::string _property_str; std::string value_str; bool value_bool; int... 实际的参与序列化反序列化对象是类的私有成员,为例让外界的数据变化不会影响原本数据所以需要让外界数据从类中获取或者赋值类中的实际对象,保障数据正确性。反序列化的思路:就是将XML文件的节点全部提取出来,对应的赋值给结构体对象的变量中去。对于C++序列化反序列化的想法,如果各位大佬有更好的想法,请赐教。序列化的思路:就是将对象的每个节点提出来拼凑成XML的文本。针对结构体定义一个序列化以及反序列化的类。此处先定义一个嵌套的结构体。上面的代码还有很大的优化空间。