punkstar/document-marshaller

一个用于使用JSON编码和解码结构化数据的库

0.1.0 2016-07-04 22:05 UTC

This package is auto-updated.

Last update: 2024-09-13 05:45:20 UTC


README

Build Status Coverage Status

这是一个实验 - 自行承担风险!

该库的目的是提供一个机制,使用单个文档进行数据的序列化和反序列化,允许在单个文件中传输和存储相关数据。

实现说明

  • 布尔值将被转换为整数

安装

composer require punkstar/document-marshaller

用法

使用DocumentDocumentFragment创建您的文档,例如

$document = new Document([
    new DocumentFragment("Fragment One", "This is the content in this fragment"),
    new DocumentFragment("Fragment Two", "This is the content in this fragment, the second")
]);

创建marshaller和校验和计算器

$checksumCalculator = new Checksum();
$fragmentMarshaller = new DocumentFragment\Marshaller();

$marshaller = new DocumentMarshaller($fragmentMarshaller, $checksumCalculator);

序列化文档

$marshalledDocument = $marshaller->marshall($document);

文档格式

文档使用以下结构以JSON编码

{
    "v": "", // Document Version
    "c": ""  // Document Checksum
    "f": [   // Document Fragments
        {
            "n": "" // Document Fragment Name
            "d": "" // Document Fragment Data
        }
        ...
    ]
}

文档

  • 一个文档必须是对象。
  • 文档应该有一个版本,由键的值v指示。如果版本不存在,则必须假定版本值为1
  • 文档应该有一个校验和,由键的值c指示。如果校验和不存在,则应跳过任何验证逻辑,并且如果适当,用户应该收到一个非致命警告。
  • 文档应该有一个片段数组,由键的值f指示。如果片段数组不存在,则必须假定文档没有片段。

文档版本

  • 文档版本必须表示为整数。

文档片段

  • 文档片段必须是一个对象数组,具有名为n的键和一个名为d的数据键。
  • 文档片段的名称和数据必须使用base64编码。

文档校验和

  • 文档校验和必须通过以下方式计算:按名称对片段对象进行排序,然后使用sha256对JSON片段数组进行哈希。

以下提供了一些示例

第一个文档包含两个片段,一个名为Header;另一个BodyHeader片段的内容是字符串HelloBody片段的内容是World。这些片段的JSON表示如下

[
    {
        "n": "Header",
        "d": "Hello"
    },
    {
        "n": "Body",
        "d": "World"
    }
]

因此,此文档的校验和将是

sha256([{"n":"SGVhZGVy","d":"SGVsbG8="},{"n":"Qm9keQ==","d":"V29ybGQ="}]) == "d827049039f82a8b65a9b0f52e637cf3bc5d1e0dec7d6198edf901a5e3dcae7d"

因此,整个文档的表示将是

{

    "v": 1,
    "c": "d827049039f82a8b65a9b0f52e637cf3bc5d1e0dec7d6198edf901a5e3dcae7d",
    "f": [{
         "n": "Header",
         "d": "Hello"
     }, {
         "n": "Body",
         "d": "World"
    }]
}