我一直在构建一个网络绘画程序,其中用户的艺术作品的状态被保存为一个 json 对象。每次我添加到客户端的撤消堆栈(只是一个描述项目状态的 json 对象数组)时,我也想将状态保存到服务器。
我想知道是否有一种优雅的方式来 [1] 只发送差异然后 [2] 能够稍后下载项目并重新创建项目的当前状态?我担心这可能会变得混乱,并且倾向于在每个撤消步骤上传完整的 json 项目状态。对优雅地解决此类问题的项目有任何建议或指示吗?
我一直在构建一个网络绘画程序,其中用户的艺术作品的状态被保存为一个 json 对象。每次我添加到客户端的撤消堆栈(只是一个描述项目状态的 json 对象数组)时,我也想将状态保存到服务器。
我想知道是否有一种优雅的方式来 [1] 只发送差异然后 [2] 能够稍后下载项目并重新创建项目的当前状态?我担心这可能会变得混乱,并且倾向于在每个撤消步骤上传完整的 json 项目状态。对优雅地解决此类问题的项目有任何建议或指示吗?
有趣且相当大的问题。许多实现/模式/解决方案都适用于这个问题,它们会根据您跟踪更新的“文档”类型而有所不同。无论如何,避免生气的一个简单方法是,而不是保存“状态”,而是保存“产生这些状态的命令”。
如果您的应用程序是完全确定的(我假设是,因为它是一个绘画程序),您可以确定对于给定时间和位置的每个命令,每次执行的结果都是相同的。
所以,我会记下代表程序中可用命令的“字母”:
等等。您可以从 SVG 实现中获得灵感。然后向/从服务器推送/拉取命令字符串:
timestamp: MOVE[0,15]DRAW[15,20,4,#000000]ERASE[4,8,10]DRAW[15,20,4,#ff0000]
这显然只是一个笼统的、伪编码的想法。希望你能得到一些启发。