20, .Net Micro Framework研究—数据的永久存储
作者: 刘洪峰 |
.Net Micro Framework不支持文件系统(目前该项功能正在研发之中),所以无法像Windows和windows ce平台那样把需要永久保存的数据保存到文件之中。内存中保存的数据只要系统一掉电,所有的数据也都消失了,这对一些需要保存参数的应用来说真是不妙。
这几天在研究MF触摸屏功能时就遇到该问题,因为触摸屏校准之后,需要保存校准后的参数,否则MF一重启,难道还需要重新校准不成?
感谢Donald Thompson 和 Rob S. Miles,从他们的大作上找到了问题的解决办法。办法就是把对象保存到Flash(EEPROM)中(有点像对象的二进制序列化)。
下面是我整理的示例代码(实现比较简单,但总觉得不太正规,不知道能存多大,也搞不清楚数据到底存放在什么位置了。):
using System;
using Microsoft.SPOT;
using System.Collections;
using System.Threading;
namespace DataStorage
{
public class Program
{
public static void Main()
{
FlashDatas fd = FlashDatas.Load();
fd.dump();
fd.Flag = "adfg";
//fd.Items.Clear();
//fd.AddItem(new FlashData(55, "1aaa"));
//fd.AddItem(new FlashData(66, "2bbb"));
//fd.AddItem(new FlashData(77, "3ccc"));
//fd.AddItem(new FlashData(88, "4ddd"));
fd.Save();
Thread.Sleep(3000);
}
[Serializable]
private class FlashData
{
public DateTime date;
public int iData;
public string sData;
public FlashData(int iData, string sData)
{
date = DateTime.Now;
this.iData = iData;
this.sData = sData;
}
public override string ToString()
{
return date.ToString() + " " + iData.ToString() + " " + sData;
}
}
[Serializable]
private class FlashDatas
{
public DateTime CreateTime = DateTime.Now;
public string Flag = @"https://blog.csdn.net/yefanqiu/";
public ArrayList Items = new ArrayList();
public void dump()
{
Debug.Print(CreateTime.ToString());
Debug.Print(Flag);
foreach (FlashData Item in Items)
{
if (Item != null)
{
Debug.Print(Item.ToString());
}
}
}
public void AddItem(FlashData Item)
{
Items.Add(Item);
}
//调入数据
public static FlashDatas Load()
{
ExtendedWeakReference ewr = ExtendedWeakReference.RecoverOrCreate(
typeof(FlashDatas), //类型,任意类都可以,其名称起到一个索引作用
0, //ID号,这个数据比较有用,不同ID号代表不同数据
ExtendedWeakReference.c_SurvivePowerdown);//该标志和.c_SurviveBoot 区别不大
ewr.Priority = (Int32)ExtendedWeakReference.PriorityLevel.Important;
FlashDatas data = ewr.Target as FlashDatas;
if (data == null)
{
data = new FlashDatas();
}
return data;
}
//保存数据
public void Save()
{
ExtendedWeakReference ewr = ExtendedWeakReference.RecoverOrCreate(typeof(FlashDatas), 0, ExtendedWeakReference.c_SurvivePowerdown);
ewr.Priority = (Int32)ExtendedWeakReference.PriorityLevel.Important;
ewr.Target = this;
}
}
}
}
以上代码在Digi开发板上测试成功,断电之后,再上电,保存的数据确实没有丢失。
MSDN中相关函数的说明如下:
ExtendedWeakReference Members
The following tables list the members exposed by the ExtendedWeakReference type.
Public Constructors
Name | Description | |
ExtendedWeakReference | Initializes a new instance of the ExtendedWeakReference class, referencing a specified object. |
Public Fields
Name | Description | |
c_SurviveBoot | Contains a flag specifying that the current weak reference will be recoverable after the device reboots. | |
c_SurvivePowerdown | Contains a flag specifying that the current weak reference will be recoverable after the device powers down and restarts. |
Public Properties
Name | Description | |
Flags | Gets the flags specifying the states from which the current weak reference should be recoverable. | |
Id | Gets the ID associated with the current ExtendedWeakReference object. | |
Priority | Gets or sets the priority level for the current ExtendedWeakReference object. | |
Selector | Gets the selector for the current ExtendedWeakReference object. |
Public Methods
Name | Description | |
PushBackIntoRecoverList | Flags an ExtendedWeakReference object as a candidate for recovery after the device reboots or powers down and restarts. | |
Recover | Recovers a specific ExtendedWeakReference object. | |
RecoverOrCreate | Attempts to recover a specific ExtendedWeakReference object, and creates a new instance of this class if the recovery attempt fails. |
Comments
- Anonymous
June 24, 2008
PingBack from http://wordnew.acne-reveiw.info/?p=2650