开发过程中遇到一个问题,我想到的解决方法是将一个dictionary字典如何存如数据库,读出来的时候还是这个字典
然后接触到对象的序列化与反序列化。开始打算序列化成为xml的形式,因为sqlserver中有xml字段,可是dictionary无法进行序列化。那么就只能序列化成为二进制流存到数据库的image字段中
通过linqtosql回来的字段查看,其实image是binary形式的。
首先设计数据库的要存储的对象的字段为image类型
然后写一个序列化的类
例如:
1 [Serializable()]
2 public class PermissionModel
3 {
4 public Dictionary Dict = new Dictionary();
5 public void Add(string key,string value)
6 {
7 Dict.Add(key, value);
8 }
9 public void Clear()
10 {
11 Dict.Clear();
12 }
13 public void Remove(string key)
14 {
15 Dict.Remove(key);
16 }
17 }
之后就可以正常的像这个对象的字典中插入数据了。
1 PermissionModel model=new PermissionModel();
2 model.Add("0", "1");
3 ......
4 model.Add("N", "N");
通过下面的方法,可以将该对象序列化成为二进制流。
1 System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
2 System.IO.Stream stream = new System.IO.MemoryStream();
3 formatter.Serialize(stream, model);
4 stream.Flush();
5 stream.Position = 0;
6 byte[] bytes = new byte[stream.Length];
7 stream.Read(bytes, 0, Convert.ToInt32(stream.Length));
8 stream.Close();
直接将bytes给数据库中的字段进行保存就好了。
下面进行反序列化。
1 System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
2 tPermissionModel perModel = 查询方法;
3 byte[] bytes = null;
4 bytes = (byte[])perModel.ModelObject.ToArray();
5 System.IO.Stream stream = new System.IO.MemoryStream(bytes);
6 PermissionModel obj = (PermissionModel)formatter.Deserialize(stream);
7 stream.Close();
通过上面这个方法查询回来的并进行反序列化后的obj就是之前存入数据库中的对象。
dictionary的遍历方法。
1 foreach (KeyValuePair entry in obj.Dict)
2 {
3 //enery.Key and entry.Value
4 }
只是不知道我这样的写法是不是好的方法呢。因为没时间去验证效率什么的。