棒棒牛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3742|回复: 5

[心得] Silverlight应用基础:独立存储简介 IsolatedStorage [复制链接]

版主

天道酬勤

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

游币
181
金币
2460
经验
2631
积分
3688
帖子
536

2011 年度优秀版主 2010 年度优秀版主

发表于 2009-11-19 20:02:28 |显示全部楼层
本帖最后由 Nereus 于 2011-3-24 09:00 编辑

首先在看本文之前可以先看看MSDN上关于独立存储的介绍:
独立存储
有关对独立存储文件进行加密和解密的完整示例
有关对独立存储文件进行签名和检查其签名的完整示例

使用独立存储的时候,应用程序对于每一个用户都会创建一个存储区.意思就是在同一台电脑上同一个应用程序,如果是多个用户将会创建多个存储区。故,每一个用户也会有多个存储区.独立存储对与不同用户是独立/隔离的(管理员除外),应用程序是使用XAP的Uri进行标识区分的。

独立存储的一些约束:
  • 在同一个Web Server和同一个文件中不同的XAP会创建不同的独立存储区
  • 如果你的站点在不同的域中则每个实例都会有自己的独立存储区
  • 在同一个应用程序中创建多个页面会共享存储区
  • 如果将XAP文件重命名那么将会重新创建存储区
  • 如果只是改变XAP的标识、版本号、程序集,存储区保持不变
  • 如果用其他应用程序内容覆盖当前程序内容而XAP文件名不变那么存储区不变


独立存储保存小量的普通数据是很不错的选择,比如用户的个性化信息、用户最近的访问记录等。举个例子,比如你想创建一个多页面注册的Silverlight程序,只有在最后一步才提交到WS/WCF进行保存,在此之间的每一步都使用独立存储保存,只有用户确定提交才真正提交到服务器写入数据库,而假如在这个时候用户突然断开连接(网络中断)或者是用户刷新程序(点击了后退按钮)等情况,在你的应用程序重启的时候便可以检测独立存储中是否有这些数据从而使用户可以继续注册直到正确提交后才删除独立存储中的数据。
独立存储中的数据不会被移除是因为它是一种断开式的IE缓存,除非用户强行删除IE临时文件夹。使用它存储重要的文档或数据是有缺陷的,因为它不可使用备份/还原并且会因为人为因素丢失(更换用户名/更换电脑),并且不能很好的管理资源文件(图片/视频),而它的优点在于对存储的数据进行隔离并且不需要手动进行HTTP缓存。

独立存储的常用操作:
独立存储使用起来很方便,这是因为它可和.NET文件流IO操作相同。使用的命名空间是System.IsolatedStorage
在MSDN上已经有很多对独立存储操作的例子,下面是演示一个简单的操作:
创建一个文件并写入数据:
try{
        using (IsolatedStorageFile stor = IsolatedStorageFile.GetUserStoreForApplication())   
        {
            using (IsolatedStorageFileStream stream = stor.CreateFile("Data.txt"))        
            {
                 StreamWriter Writer = new StreamWriter(stream);
                 Writer.Write(DateTime.Now);
                 Writer.Close();        
             }
                // MessageBox.Show("Data written to date.txt");   
         }
     }
     catch (Exception ex)
    {   
        MessageBox.Show(ex.Message);
    }

如果是WIN7/VISTA用户那么可以在
C:\Users\[UserName]\AppData\LocalLow\Microsoft\Silverlight\is\[Unique_Identifier]中找到创建的文件.
使用调试你也可以查看的到,如下图:
image_thumb8.png

虽然文件路径名称很难读懂,但是你不用担心这些,这都交给程序去管吧,而你只需要使用IsolatedStorageFile类的GetFileNames() 和OpenFile()去操作它们就行了。

请求更多的存储空间:
每个独立存储区初始大小只有1MB(有个特殊情况,如果你的程序使用了out-ofbrowser特性那么独立存储区的空间初始化是25MB),当让你可以请求用户来增大空间。你也可以使用IsolatedStorageFile.AvailableFreeSpace属性来查看剩余空间。如果需要增加更多的空间,可以使用IsolatedStorageFile.IncreaseQuotaTo()方法,传入你请求的大小,Silverlight会给用户显示一个对话框,对话框内容包含了当前存储区大小、所请求的大小、和请求的Silerlight Appliaction URL.如下图:
image17.png

使用IncreaseQuotaTo()方法需要注意两点:
  • 必须使用用户事件来触发请求比如Button Click事件,如果使用其他途径比如Page Load那么请求会被忽略,
  • 请求的空间必须大于当前空间大小,否则会产生异常。这就意味着你在请求扩大空间的时候必须要明确你的剩余空间。

下面是一个例子:
using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
{
    //写入一个100KB的文件,当剩余空间小于100KB时便会请求扩大空间   
  if (store.AvailableFreeSpace < 1000 * 1024)
    {        
       if (store.IncreaseQuotaTo(store.Quota + 1000 * 1024 - store.AvailableFreeSpace))
        {   
             // 请求成功.
        }else
        {           
            MessageBox.Show( "没有?够的空?包保存文件.");
            return;        
         }
    }    //继续保存文件
}

上面的例子是在每次存储空间不够的时候进行请求增加空间,这样的请求会过于频繁。为避免这种情况你也可以根据需求一次请求足够的空间。

序列化/反序列化对象

使用.NET文件操作的方式保存数据并不是唯一的选择,也可以使用XmlSerializer进行序列化和反序列化对象。使用XmlSerializer类需要引用System.Xml.Serialization.dll。它并不是对所有的对象有效,有下面两点约束:
  • 需要序列化的对象必须要有一个无参的构造函数,因为确保在反序列化的时候能实例化对象
  • 属性需要是Public的,私有属性和属性的验证逻辑会被忽略


下面看一个例子,下图是例子的效果图:
image1.png

创建一个Person类:
public class Person
{
    public string FirstName { get; set; }   
    public string LastName { get; set; }
    public DateTime? DateOfBirth { get; set; }   
    public Person() { }
    public Person(string firstName, string lastName, DateTime? dateOfBirth)   
    {
        FirstName = firstName;        
        LastName = lastName;
        DateOfBirth = dateOfBirth;   
     }
}
下面是对Person类进行序列化和反序列化操作:
序列化:
Person person = new Person(FirstName.Text, LastName.Text, BirthDay.SelectedDate);
using (IsolatedStorageFile store =IsolatedStorageFile.GetUserStoreForApplication())
{    //创建一个以 用户名.Person的序列化文件
    using (FileStream stream = store.CreateFile(person.FirstName + person.LastName + ".person"))   
    {
        serializer.Serialize(stream, person);   
     }
     // 更新列表.   
     ListPerson.ItemsSource = store.GetFileNames("*.person");
}

反序列化:
if (ListPerson.SelectedItem == null)
      return;
using (IsolatedStorageFile store =IsolatedStorageFile.GetUserStoreForApplication())
{   
    using (FileStream stream = store.OpenFile(ListPerson.SelectedItem.ToString(), FileMode.Open))
    {        
        Person person = (Person)serializer.Deserialize(stream);
        FirstName.Text = person.FirstName;        
        LastName.Text = person.LastName;
        BirthDay.SelectedDate = person.DateOfBirth;   
    }
}

序列化以后的文件是可以在存储区中找到的..如果你了解独立存储,那肯定会问为啥不用IsolatedStorageSettings,反而要用序列化来捣腾。。
主要的目的是告诉大家Setting也是使用序列化和反序列化方式来存储数据的..下图是序列化文件和Settings文件的形式:
0.jpg

查看其中的内容(修改后缀为.txt文本格式即可)。。
Settings文件中的内容:
<ArrayOfKeyValueOfstringanyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance"   xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<KeyValueOfstringanyType>
     <Key>URL</Key>
     <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string">www.bbniu.com</Value>
</KeyValueOfstringanyType>
</ArrayOfKeyValueOfstringanyType>
注意:文件中有指出Value存储的类型

person文件的内容:
<?xml version="1.0" encoding="utf-8"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstName>Beyonce </FirstName>
  <LastName>Gisele knowles</LastName>
  <DateOfBirth>1981-09-04T00:00:00</DateOfBirth>
</Person>
这个看上去与上面的文件内容有几分相似..XML的东西就不多说了..  
OK..这些基本上就是在MSDN之外加了一点小小的简介,希望各位能更加充分的了解独立存储..
本文内容是《Silverlight3高级编程》的个人笔记..如有错误指出还往各位指出..

附:如何更加快捷的管理独立存储
1

查看全部评分

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

游币
263
金币
540
经验
1785
积分
2564
帖子
696
发表于 2009-11-19 20:24:27 |显示全部楼层
Good!
与您一起成长

V5

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

游币
101
金币
83
经验
315
积分
2220
帖子
160
发表于 2009-11-19 20:32:50 |显示全部楼层
收藏
天道酬勤!
http://www.cnblogs.com/zhw511006/

V1

希望有好运的人

Rank: 1

游币
100
金币
66
经验
18
积分
25
帖子
9
发表于 2010-1-13 11:49:15 |显示全部楼层
问一下这个isolatedstorage有失效时间控制吗?
我还活着!

版主

天道酬勤

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

游币
181
金币
2460
经验
2631
积分
3688
帖子
536

2011 年度优秀版主 2010 年度优秀版主

发表于 2010-1-13 15:14:09 |显示全部楼层
没有,需要人为管理. 也可以自己写程序管理,比如时间控制

V3

Rank: 3Rank: 3Rank: 3

游币
124
金币
38
经验
250
积分
324
帖子
71
发表于 2010-7-20 20:04:12 |显示全部楼层
支持,支持Nereus
天地无数有情事  世间满眼无奈人
您需要登录后才可以回帖 登录 | 注册

bbniu.com (湘ICP备06008909号)  

GMT+8, 2012-5-22 20:50

Copyright © 2009-2011 bbniu.com. All Rights Reserved.

回顶部