[C#] 透過 JSON.net 使用 BSON 格式

2012-12-02

 

最近在研究NoSQL 的技術,看到一個很有趣的名詞,叫做BSON

2012-10-10_164541

這邊有很詳細的 解說 http://bsonspec.org/ ,如果看不太懂,可以看一下中國的朋友,他的圖文解說..XD

http://blog.csdn.net/dujingjing1230/article/details/5392483

就我的看法, 因為 JSON 本身格式的彈性過於鬆散跟簡單,這也是他的方便之處,他就是Key-Value 的觀念,但是對程式運作上面.

我無法知道型別這件事情很麻煩,因為我必須要知道型別,不然這中間會導致處理上面造成資源浪費無論是記憶體或是時間..

所以BSON 應然而生,順道說一下 XML 因為有XML-Schema 輔助資料型別定義,所以再處理的代價上面會比較輕鬆..

看一下官方對於規格上面的定義

2012-10-10_170048

繼續往下走..如何透過JSON.net 來處理BSON

首先我先定義一個Sample 用的物件

public class User
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime Birth { get; set; }
}



很簡單也很好理解..



再來進行BSON  序列化



var user = new User { Name = "許當麻", Age = 29, Birth = new DateTime(1983, 5, 24) };

var memoryStream = new MemoryStream();
BsonWriter bsonWriter = new BsonWriter(memoryStream);
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(bsonWriter, user);
var res = string.Format(BitConverter.ToString(memoryStream.ToArray()));
txtResult.Text = res;


結果:



2012-10-10_165146



簡單來說那物件已經變成

31-00-00-00-02-4E-61-6D-65-00-0A-00-00-00-E8-A8-B1-E7-95-B6-E9-BA-BB-00-10-41-67-65-00-1D-00-00-00-09-42-69-72-74-68-00-00-40-28-62-62-00-00-00-00

接下來如何進行還原為物件呢?!


 


/// <summary>
/// 將String 轉為 byte[]
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private byte[] StringToBytes(string str)
{
String[] arr = str.Split('-');
byte[] array = new byte[arr.Length];
for (int i = 0; i < arr.Length; i++) array[i] = Convert.ToByte(arr[i], 16);
return array;

}

protected void Button2_Click(object sender, EventArgs e)
{

var memoryStream = new MemoryStream(StringToBytes(txtResult.Text));

BsonReader reader = new BsonReader(memoryStream);
JsonSerializer serializer = new JsonSerializer();
var user = serializer.Deserialize<User>(reader);

Response.Write(user.Name);
}


結果:



2012-10-10_165406



結論:



BSON 其實一般實作上面用不到,但是在MongoDB其實常可以看到這名詞,他對於資料儲存上跟操作上面,接下來就看未來發展,畢竟他使用非人類可以直接理解的格式,這點倒是失去了原本JSON 的可讀性..



不過多了解一個東西對自己總是有幫助的



 



參考文件:



http://stackoverflow.com/questions/1230303/bitconverter-tostring-in-reverse
http://james.newtonking.com/archive/2009/12/26/json-net-3-5-release-6-binary-json-bson-support.aspx
http://bsonspec.org/



文中案例


當麻許的超技八 2014 | Donma Hsu Design.