Json格式在用于数据存储方面比xml有着空间上的优势,Json格式又主要分为两种格式:名称/值 对 和数组。
在我的业务环境中需要先把一种空间比较小的格式。
测试如下:
取数据库中的一张表然后生成两种格式的Json文件进行对比。
生成名称/值 对的格式,样式如下:
大小为:6460KB
生成数组的格式,样式如下:
大小为:2736KB。
数组由于列的信息只显示一次,大小约为原来的50%。
生成两种格式的C#代码如下:
static void Main(string[] args)
{
DataTable dt = DataAccess.GetData("select * from stk_code"); string sJson= JsonConvert.SerializeObject(dt);
FileStream fs = new FileStream("D:\\Json.txt", FileMode.Append);
StreamWriter sw = new StreamWriter(fs, Encoding.Default);
sw.WriteLine(sJson);
sw.Close();
fs.Close(); Dictionary<string, List<object>> dataList = DataToList.DataTableToList(dt);
sJson = JsonConvert.SerializeObject(dataList);
fs = new FileStream("D:\\Json2.txt", FileMode.Append);
sw = new StreamWriter(fs, Encoding.Default);
sw.WriteLine(sJson);
sw.Close();
fs.Close(); Console.ReadKey();
}
将Datatable转为Dictionary 的方法如下:
public class DataToList
{
/// <summary>
/// 将datarow 转化为Dictionary<string, List<object>>
/// 结果集中第一行为列名,第二行开始为数据,数据行用数字0-N表示
/// </summary>
/// <param name="table"></param>
/// <returns></returns>
public static Dictionary<string, List<object>> DataTableToList(DataTable table)
{
Dictionary<string, List<object>> DataList = new Dictionary<string, List<object>>(); List<object> itemValue = new List<object>();
string itemKey = "col"; foreach (DataColumn dc in table.Columns)
{
itemValue.Add(dc.ColumnName);
}
DataList.Add(itemKey, itemValue); int i = ;
foreach (DataRow dr in table.Rows)
{
itemKey = i.ToString();
itemValue = new List<object>(); foreach (var val in dr.ItemArray)
{
itemValue.Add(val);
}
DataList.Add(itemKey, itemValue);
i++;
} return DataList;
} }
//写流文件
ObjectStream.Serialize<Dictionary<string, List<object>>>(dataList, @"D:\stream.bin");
//读流文件
Dictionary<string, List<object>> ndt = (Dictionary<string, List<object>>)ObjectStream.Deserialize(@"D:\stream.bin");
数组的格式虽然占用的空间会小一些,但需要进行一次转换,所以在选择的时候需要视具体情况而定。
主要有两方面的因素:
1.列名和内容的比例大小关系,如果大部分字段是文本类的,大小的区别应该不大。采用数组反而多一次转换。
2.是带宽为稀缺资源还是CPU为稀缺资源?
第三种方案,将数据对象直接存储为流:
如这个对象是DataTable则大小为:10368KB。如采用简单一点的对象如
Dictionary<string,List<object>>则大小为:3225
所以大小取决于对象的简单程度。
对象和流之间的转换代码:
public class ObjectStream
{
/// <summary>
/// 将一个对象转换为流文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <param name="filename"></param>
/// <returns></returns>
public static bool Serialize<T>(T value, string filename)
{
try
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bs = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.FileStream stream = new System.IO.FileStream(filename, System.IO.FileMode.Create);
bs.Serialize(stream, value);
stream.Close();
return true;
}
catch
{
return false;
}
} /// <summary>
/// 从流文件中获取一个对象
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static Object Deserialize(string fileName)
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bs = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.FileStream stream = new System.IO.FileStream(fileName, System.IO.FileMode.Open);
return bs.Deserialize(stream);
}
}