文档章节

游戏服务器-存储格式

l
 leekay
发布于 2016/06/24 16:25
字数 673
阅读 12
收藏 0

一、什么是Json

    Json(JavaScript Object Notation)是一种轻量级的数据交换格式,它是源自javascript中的对象和数组,所以这两种结构就是对象{}和数组[]两种结构。

二、什么是serialize

    序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。

三、为什么选择Json

    网上有很多两者的对比文章http://www.cnblogs.com/zcy_soft/archive/2011/03/24/1993650.html,Json在存储空间和读写速度都要优于serialize,特别是我们使用内存数据库,这两点都非常关键。

四、如何关闭Redis内置的序列化

    php-redis内置并默认开启了自动序列化,只需在redis对象创建时写入下面代码即可关闭自动序列化。

$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);

五、array和Json互相转换

    自己封装了两个方法,支持了Json中文。

/**
 * 数组转换json支持中文
 *
 * @param $arr
 *
 * @return string
 */
function myJsonEncode($arr){
    if(version_compare(PHP_VERSION, '5.4.0', '<')){
        $str = json_encode($arr);
        $str = preg_replace_callback("#\\\u([0-9a-f]{4})#i", function ($matchs){
            return iconv('UCS-2BE', 'UTF-8', pack('H4', $matchs[1]));
        }, $str);
        return $str;
    }else{
        return json_encode($arr, JSON_UNESCAPED_UNICODE);
    }
}

/**
 * json转换数组
 *
 * @param $json
 *
 * @return array
 */
function myJsonDecode($json){
    try{
        $arr = json_decode($json, true);
    }
    catch(Exception $e){
        $arr = array();
    }
    return empty($arr) ? array() : $arr;
}

六、Json的对象和数组

    在PHP中,我们一般会将数组和Json相互转换的使用和存储。然而PHP对数组是这样介绍的:

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,
因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能
性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。

所以,尴尬的地方就来了,它既可以是一个数组,也可以是列表或者字典,也就是我们常说的有序数组和键值对数组。而对于游戏前端,Unity3D使用的C#而言这些都不是一个概念,他们与规范的Json一样[]是数组,{}是对象,这在数据交互时经常出问题,当一个数据

有值时是键值对array("Name"=>"张三")对应转换为Json的{"Name":"张三"} 是对象
空的时候是array()而转换为Json变成了[] 是数组

这就导致了一些交互问题,而PHP提供了一个数组对象ArrayObject()转换为Json确实是{},但它需要在存储前自行转换为键值对数组使用。

© 著作权归作者所有

l
粉丝 1
博文 17
码字总数 6436
作品 0
虹口
程序员
私信 提问
游戏服务器中的日志处理方式之一

在游戏开发的过程中,我们需要记录一些日志,以便以后了解游戏运行的情况,以及根据日志发现并处理游戏中的突发情况。 一,游戏日志可以分为以下几种: 1)系统日志 2)用户操作日志 3)异常日志...

shezjl
2015/07/05
0
0
日志数据是选择mysql 还是 mongodb 还是 postgredb

@i5ting 你好,想跟你请教个问题: 我是做游戏服务器的, 目前我的游戏服饰部署在阿里云上面的,现在我们要将玩家操作日志和一些重要的日志分析入库。 日志服务器获取的日志服务器是json格式...

shezjl
2015/08/27
728
1
NoahFrame 游戏开发解决方案 5.2.0 版本发布了

NoahFrame 游戏开发解决方案 5.2.0 版本发布了。 NoahFrame/NF是一个c++开发的轻量级分布式游戏服务器架构,内部自带actor模式以及高效网络库,支持插件编程和模块编程,并提出重要编程思想-...

kytoo
2017/09/25
1K
5
SUN 开源游戏服务器端项目--Darkstar

Sun game server , 简称 (sgs) 是 sun 公司的一个开源项目 , 主要目标是针对 mmo 游戏的服务器端开发. SGS 提供的主要功能 : l 服务器端的扩展 : 传统的扩展方法是将整个游戏区域分成多个区 ...

匿名
2009/04/10
13.1K
0
网络游戏服务器中事件和状态

网络游戏中传递的报文,主要分为两种: 事件报文 状态报文 报文的实现 事件需要保证顺序,可靠,例如玩家使用某个技能,而事件通常可以采用类似 RPC的方式来实现,事件报文的传递,采用类似于...

李勇2
2016/05/10
99
0

没有更多内容

加载失败,请刷新页面

加载更多

UserInputControls用户输入控制

enum UserInputControls { kGovernedByOrthoMode = 0x0001,//正交模式管理 kNullResponseAccepted = 0x0002,//允许输入空 kDontEchoCancelForCtrlC = 0x0004,//ctrl C 模式不能重复......

一个小妞
3分钟前
0
0
分布式系统的事务处理

当我们在生产线上用一台服务器来提供数据服务的时候,我会遇到如下的两个问题: 1)一台服务器的性能不足以提供足够的能力服务于所有的网络请求。 2)我们总是害怕我们的这台服务器停机,造成...

群星纪元
5分钟前
0
0
Kanban VS Scrum:哪个是最好的敏捷项目管理框架

“我们使用敏捷开发。”在与软件开发团队交流时,你会听到很多这样的说法。根据统计,2018年全球约有90%的开发人员在使用敏捷开发。Choerodon猪齿鱼团队也是其中之一。 但是,敏捷并不统一。...

Choerodon
9分钟前
0
0
vue select 慢一步

我在使用vue的select的时候,@change事件里面,写一个axios拿到数据,然后修改某个变量,按理修改变量会立即呈现在页面上面,但实际情况是,值是变更了,但是页面上的效果慢了一步,非常奇怪...

朝如青丝暮成雪
14分钟前
0
0
分布式架构 核心知识体系

1.问题 1、何为分布式何为微服务? 2、为什么需要分布式? 3、分布式核心理论基础,节点、网络、时间、顺序,一致性? 4、分布式是系统有哪些设计模式? 5、分布式有哪些类型? 6、如何实现分...

小刀爱编程
16分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部