随手涂鸦的:
// HellowTest2008.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "CLock.h"
/*
V1表示旧的数据,V2表示扩充的数据
旧数据nVersion表示为0, 扩充数据nVersion表示为1
*/
struct Role1
{
int V1n1;
int V2n1;
};
struct Role2
{
int V2n1;
int V1n1;
};
class CRole
{
public:
private:
public:
int V1n1;
Role1 V1Role1;
Role2 V1Role2;
int V2n1;
int V2n2;
int V2n3;
private:
};
struct ChunkHead
{
int nLen;
};
struct Chunk
{
int nLen;
int ChunkType;
char Buffer;
int CRC;
};
/*
CSave表示一个已经从介质里读取出来的数据
*/
class CSave
{
public:
CSave();
void V1Read(CRole *pRole);
void V1Write(CRole *pRole);
void V2Read(CRole *pRole);
private:
public:
/*
V1
*/
int nVersion;
char Buffer[1024];
/*
V2
*/
char V2Buffer[1024]; //这段的组成规则是ChunkHead|Chunk|Chunk|Chunk
private:
};
CSave::CSave()
{
nVersion = 0;
}
void CSave::V1Read(CRole *pRole)
{
/*
BufferXXX表示产出一个最终结果值,这里我们不关心
*/
if(0==nVersion)
{
pRole->V1n1 = BufferXXX;
/*
每个结构是否有自己的序列化函数,这都不重要.关心的是一个写值的动作
*/
pRole->V1Role1.V1n1 = BufferXXX;
pRole->V1Role1.V1n1 = BufferXXX;
}
/*
扩充后,根据版本号来读取。
这里的扩充一般会有两种情况,
1.先扩充存储介质(比如数据库)
2.先扩充代码,根据写入时来自动扩充数据库
3.两边一起扩充
如果是第一种,或许不要版本号,只要代码扩充好,然后把介质中新加的字段一个初始值,
最后再精心修改下0==nVersion中的代码,算好介质中各种新加入的偏移值。这明显是最差的,把同介质之间的接口作用放大。
如果是第二种(大多数下是),首先在读的时候仍然按照旧版本读(这个时候介质还没扩充),写入时按照
新版本的写,然后修改版本号。
如果是第三种,其实跟第一种类似,把同介质之间的接口作用放大。还要需要修改数据库代码。而数据库,更倾向看成是一个
read,write的东西。只要关心数据和长度这两个参数即可.如果你想要查看,我觉得单独做个读取工具更好。而且这段读取的
代码和你真正工程里读取数据的代码区别不大。
下面代码给出第二种方法
*/
if(1==nVersion)
{
//先调用0==nVersion的函数读一遍
pRole->V1Role1.V2n1 = BufferXXX;
pRole->V2n1 = BufferXXX;
//......
}
if( 2==nVersion )
{
//掉调用1==nVersion的。。
//......
}
/*
这种用版本号的方法可以解决兼容的问题。但是不好的地方是让第二个版本的数据知道了第一个版本的数据,在
数据的意义上它们是等同的,但是处理方法却变成了一种兼容的方式。同时,BufferXXX获取的接口中,也要从一个
大数据里面取出对应的第二个版本数据。这些都明显增加了二次开发和扩充的代价。我以前一次工作中,数据库的设计
是针对每个角色都有特别大的空间,防止以后扩充不够。结果每次增加新东西时,总要奔赴在修改各种旧的代码之间,
即使你不用动它,它们也总是在你调试的时候跳来跳去。更可恶的是数据库的字段名,一开始只是简单的叫d1,d2,d3...dn,
在核对各个字段上又浪费了不少时间。结果在扩充一些大功能的时候,另外建立了单独的空间,终于让它们享受一样的
待遇了。
于是就想,为什么不把扩充的数据也当成一个全新的数据,只是让他们最终流向的Role结构不一样而已。完全可以
让它们在新旧版本上的数据流程都一样,就像新写了一遍。
*/
}
void CSave::V2Read(CRole *pRole)
{
/*
每个新加的数据只要按Chunk块排好,读、写总的函数完全不用变,每个人关心自己的
HandleChunkType()即可。
*/
int nHasLen = 0;
while(ChunkHead.nLen>nHasLen)
{
switch(Chunk.ChunkType)
{
HandleChunkType();
}
nHasLen += Chunk.nLen;
}
}
void CSave::V1Write(CRole *pRole)
{
/*
写这里相对简单, 因为得到的都是最后一组、最新的数据。不做更多的阐述
*/
}
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
但是,结合PNG的这种格式,仍然可以在游戏中做点事情。比如可以在扩充字段时,旧的方案需要修改2-3个点,完全可以改为只要修改一个点就够了。
修改的2-3个点包括,对数据库字段,SQL语句,变量的读取。如果有一些中间件变化得可能更多。
用一些小技巧,可以把这些修改点都集中到一个函数上。所以PNG还是有很大启发的。
分享到:
相关推荐
PNG图像数据结构的设计旨在提供高质量的透明度支持、颜色深度选择以及反交错功能,同时保持文件大小合理。以下是对PNG图像数据结构的详细介绍: 1. **文件头信息**: PNG文件以一个8字节的PNG标识符(`137 80 78 ...
小白学数据结构的笔记,之前看的没做笔记,今天看到第四章讲串,我做了一个笔记,发了一个博客,以后方便自己查阅,大家想看其他内容,我还会接着做好笔记,明天第5章数组和广义表
7. **元数据管理**:工具允许用户查看和编辑PNG图片的元数据,如作者信息、版权声明、创建日期等,方便管理和追踪图片来源。 8. **导出与导入**:除了常见的PNG格式,PNG超级工具可能还支持导出为其他图像格式,如...
《PNG:The Definitive Guide》这本书深入解析了PNG图像格式的各个方面,是理解、创建和优化PNG图像的重要资源。以下是关于PNG格式的一些关键知识点: 1. **PNG格式的起源**:PNG格式是在GIF图像格式受到专利限制后...
PNG格式的图标因其透明背景和高质量的图像表现力,在网页设计中被广泛采用。以下是关于网页按钮小图标以及PNG格式的详细知识: 1. **网页按钮小图标的作用**: - **导航**:通过清晰的图标,用户可以快速识别功能...
数据结构和算法是计算机..."LinuxIDC.com.png"可能是某个网站的logo,而"Linux公社www.linuxidc.com.url"则指向了一个可能提供相关技术文章和讨论的平台,你可以在这里找到更多关于Java编程和数据结构与算法的信息。
数据结构是计算机科学中的核心概念,它涉及到如何在内存中有效地组织和管理数据,以便进行高效的操作。在C++编程语言中,理解并熟练运用数据结构对于开发高效算法至关重要。本资料包“数据结构.zip”包含了以png格式...
0011 png文件数据结构.txt 0012 swf文件数据结构以及转为exe或从exe中剥离出swf的代码.txt 0013 TIF文件数据结构.txt 0014 wav文件数据结构以及绘制静态波形图的代码.txt 0015 wma文件数据结构以及读取附加信息...
PNG 图像读写及显示 本文主要介绍了使用 libpng 库函数设计了一个...本文介绍了 PNG 图像格式、PNG 文件结构、PNG 数据块、libpng 库函数和图像浏览器设计等知识点,旨在帮助读者更好地理解和应用 PNG 图像处理技术。
数据结构第一章 绪论 思维导图
- **数据块**:PNG 文件由多个数据块组成,每个数据块包含类型、长度、数据和校验码四部分。 - 类型:表示数据块的功能或含义。 - 长度:表示数据字段的字节数。 - 数据:实际的数据内容。 - 校验码:用于确保...
这本书深入浅出地介绍了数据结构和算法分析的关键概念,对于学习和理解这些核心知识至关重要。数据结构是编程的基础,它涉及如何在计算机中组织和存储数据,以便高效地进行访问和操作。算法则是解决问题的步骤或程序...
`图.png`可能是一些辅助理解的数据结构或算法的示意图,例如二叉搜索树、堆或者图的表示,用于帮助设计和优化系统。 `停车场数据.txt`可能存储了模拟的停车场数据,包括车位状态、车辆信息等,用于测试系统功能。 ...
1数据结构.png
“树状数组.png”可能是在讲述树状数组(也称为线性恒定时间查找树),这是一种高效的数据结构,用于维护一个数组上的区间更新和查询操作,其查询和更新的时间复杂度为O(log n)。 “二叉排序树.png”是指二叉搜索树...
1.把需要转化的.PNG文件拷贝到PNG文件夹内 2.运行“单张转换.exe”或“批量转换.exe”。 单张转换:将一张png图片转换成多种大小的ico图标 放在程序目录下; 批量转换:将多张png图片转换成同种大小的ico图标 放在...
数据结构是计算机科学中的核心概念,它涉及到如何在内存中有效地组织和管理数据,以便进行高效的操作。在编程和算法设计中,理解并熟练运用数据结构至关重要,因为它们直接影响到程序的性能和复杂性。本资源是个人...
在这个系统中,C语言被用来编写核心算法和数据结构,确保了程序的效率和可读性。 数据结构是存储和组织数据的方式,它们直接影响到算法的效率。在这个项目中,两个主要的数据结构——链表和数组,都扮演了重要角色...
6. **元数据**:PNG文件可以包含元数据,如作者信息、版权、描述等。 在软件开发中,PNG图标的作用: 1. **用户界面设计**:PNG图标可以清晰地表示功能按钮、菜单项,使用户界面更直观易懂。 2. **移动应用**:移动...
4. **交错和快速预览**:PNG图像可以采用交错方式存储,允许在图像数据未完全加载时显示低分辨率的预览。PNGImage控件可以利用这一特性提供即时反馈。 5. **伽玛校正**:PNG图像允许包含伽玛信息,用于校正显示设备...