CBOR(Concise Binary Object Representation)是一种通用的二进制数据格式,其定义在RFC 7049中。CBOR的数据模型是JSON数据模型的扩展版本,支持比JSON更多的数据类型。CBOR的灵感来源于MessagePack,但它并不是MessagePack的版本或替代品。
这个实现是由Peter O.编写的,并以CC0声明的形式发布到公共领域。这个实现既可以作为JSON的读写器,也可以将数据从JSON转换为CBOR,反之亦然。此外,这个实现还支持任意精度的二进制和十进制浮点数以及具有任意精度分量的有理数。源代码可以在项目页面上找到。
从0.21.0版本开始,C#实现可以在NuGet包库中找到,名称为PeterO.Cbor。要将这个库作为NuGet包安装,可以在NuGet包管理器控制台中输入Install-Package PeterO.Cbor。
这个库定义了一个名为CBORObject的类,它允许从数据流和字节数组中读取和写入CBOR对象,以及将JSON文本转换为CBOR对象并返回。有关更多信息,请参见C#(.NET)API文档。C#实现被设计为可移植类库。
创建一个映射并将该映射转换为CBOR字节和JSON字符串:
var cbor = CBORObject.NewMap()
.Add("item", "any string")
.Add("number", 42)
.Add("map", CBORObject.NewMap().Add("number", 42))
.Add("array", CBORObject.NewArray().Add(999f).Add("xyz"))
.Add("bytes", new byte[] {0, 1, 2});
var bytes = cbor.EncodeToBytes();
string json = cbor.ToJSONString();
Console.WriteLine(json);
从文件中读取数据(C#)。请注意,所有读取和写入文件的示例都假定平台支持文件I/O;可移植类库并不做此假设。
var cbor = CBORObject.DecodeFromBytes(File.ReadAllBytes("object.cbor"));
另一个从文件中读取数据的示例:
using (var stream = new FileStream("object.cbor", FileMode.Open)) {
var cbor = CBORObject.Read(stream);
if (stream.Position != stream.Length) {
// The end of the stream wasn't reached yet.
} else {
// The end of the stream was reached.
}
}
如果一个字节数组包含多个CBOR对象,应该将字节数组包装在MemoryStream中,并使用该流读取对象,因为DecodeFromBytes假设数组只包含一个CBOR对象。
using (var stream = new MemoryStream(byteArray)) {
var cbor = CBORObject.Read(stream);
}
将CBOR数据写入文件(C#):
using (var stream = new FileStream("object.cbor", FileMode.Create)) {
cbor.WriteTo(stream);
}
将多个对象写入文件,包括任意对象:
using (var stream = new FileStream("object.cbor", FileMode.Create)) {
CBORObject.Write(true, stream);
CBORObject.Write(422.5, stream);
CBORObject.Write("some string", stream);
CBORObject.Write(CBORObject.Undefined, stream);
CBORObject.NewArray().Add(42).WriteTo(stream);
}
从文件中读取JSON:
using (var stream = new FileStream("object.json", FileMode.Open)) {
var cbor = CBORObject.ReadJSON(stream);
}
将CBOR对象写为JSON:
File.WriteAllText("object.json", cbor.ToJSONString(), new System.Text.Encoding.UTF8Encoding(false));
版本1.2现在支持将对象写入JSON的第三种方式:CBORObject.WriteJSON方法:
using (var stream = new FileStream("object3.json", FileMode.Create)) {
CBORObject.WriteJSON("some string", stream);
}
请注意,本节中的所有代码示例都以公共领域的形式发布,如http://creativecommons.org/publicdomain/zero/1.0/所述。