.Net Micro Framework研究—数据的永久存储

简介: 感谢Donald Thompson 和 Rob S. Miles,从他们的大作上找到了问题的解决办法。办法就是把对象保存到Flash(EEPROM)中(有点像对象的二进制序列化)。

.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 = @"http://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
1.png

相关文章
.Net Micro Framework研究—Digi开发板初探
写的比较基础全面,由于我们北航的研发团队先研究了Digi的开发板,所以直到今天Digi开发板才到我的手上,我的《Micro Framework研究》系列文章以后也会陆续推出
704 0
.Net Micro Framework研究—IO读写
试验平台:Digi MF开发板
437 0
.Net Micro Framework研究—串口操作
试验平台:Digi MF开发板,Digi提供的示例中包含了串口的示例程序
557 0
|
网络协议
.Net Micro Framework研究—TCP/IP通信
关于网络通信方面,Digi提供了两个程序,一个是TCP Server运行在Digi的开发板上,一个是TCP Client程序,运行在PC上,通过网络,上位机很容易控制Digi开发的IO信号
621 0
.Net Micro Framework研究—模拟器改造
由于Digi提供的开发板没有LCD显示屏,所以有关绘图方面的操作,只好在模拟器上进行了。
541 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
38 0
|
28天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
28 0
|
28天前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
95 5
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0