7月11日 星期六 天气,下了一场意外的雨
今天还要加班,所以继续写咯。今天的目标是写一个备份类出来。
备份类的思路先整理一下:
1.从数据库中获取所有数据,而且要包括数据库的元数据信息,即是数据表名,数据表的各个字段。以待在恢复的时候重建数据库。这一部分要用LINQ来写。
14:10----对于这一点,有一个问题,有一些备份操作是部分备份,即只导出符合条件的那一部分数据表的数据,如果用重建的方法来重建数据库,就会导致原有数据丢失的情况。解决方法是开一个接口,让用户决定是否重新数据库。如果不重建,那么要做的就是要在不改动表结构的情况下进行数据的更新。
14:48------使用LINQ将实体类导出,然后序列化到二进制文件,注意Entity的可视化编辑视图中要修改属性SerializationMode,改为Undirectional。这里有一个问题是反序列化的时候,只能从文件中反序列化出一个Object。(我记得Java的ObjectOutputStream/OjectInputStream是什么顺序写,就可以什么顺序读的。。.net啊,.net啊)好吧,解决方法可以这样,创建一个硕大无比Arraylist容器,然后啥都往里装吧。
14:58-------先停一下这个,做点团队协作的工作,写注释。。。。
15:41--------又遇到一个问题了,如果序列化一个硕大无比的Arraylist,就无法与写入进度条挂钩了。
16:41--------解决方法:一个一个写,某写好一个都发一个完成信息。至于怎么一个一个写呢?用bytes数组来写,先写一个长度,然后写入整个对象。读的时候写读长度,然后根据长度对Bytes数组
17:21--------刚才做的是找到一种方法将对象转换成byte[]。网上找了一下,看来只有序列化这条路。如果是一般定义的对象,那就已经找到方法了。用一个MemoryStream,还有一个BinaryFormatter来实现序列化,写到内存流里面,然后用内存流的ToArray方法来转换成byte[]。
However,项目用的是LINQ,所有在数据库读出的实体类都是在Entity里面定义的,也就是说必须用LINQ本身的定义的序列化方法,有一个类DataContractSerializer负责做这个事情。然而问题又来了,这个类在VS中居然没有找到。。。。
真是奇怪了。还有一个方法是另建一个cs文件,在里面添加partial类定义,为每一个需要序列化的类添加[Serializable]的标签。shit.
终于找到原因了!!原来电脑里面的.NET类库是3.0版本的,而DataContractSerializer需要3.5版本!
----------7月13日 10:59 终于彻底解决上面这个问题了。呵呵,只怪自己对.net太不熟悉了。其实版本用的的确是3.5版的,但是需要在项目添加引用才能使用System.Runtime.Serialization命名空间里面的东西。shit!
2.将这些数据写入到二进制文件中,需要利用.net文件操作部分的内容。
3.在备份类中还需要有 完成百分比事件 , 以使得备份过程可以与ProgressBar关联起来。
好吧,动手做吧!