Silverlight离线模式与操作系统交互技术详解
立即解锁
发布时间: 2025-08-13 02:53:43 阅读量: 20 订阅数: 26 

### Silverlight 离线模式与操作系统交互技术详解
#### 1. 数据序列化与反序列化
在 Silverlight 中,我们可以使用 `DataContractSerializer` 类来实现对象的序列化和反序列化。以下是将 `Product` 对象集合序列化到文件的示例代码:
```csharp
new DataContractSerializer(typeof(List<Product>));
serializer.WriteObject(fileStream, productCollection);
```
注意,为了使上述代码及后续示例正常工作,需要添加 `using` 指令到 `System.Runtime.Serialization` 命名空间。
反序列化文件中的 `Product` 对象集合并恢复该集合的代码如下:
```csharp
using (IsolatedStorageFileStream fileStream =
store.OpenFile("ProductCollection.xml", FileMode.Open))
{
DataContractSerializer serializer =
new DataContractSerializer(typeof(List<Product>));
List<Product> productCollection =
serializer.ReadObject(fileStream) as List<Product>;
// Do something with the collection
fileStream.Close();
}
```
#### 2. 隔离存储磁盘空间配额
当 Silverlight 应用程序首次运行时,它在隔离存储中会被分配 1MB 的空间配额。这个配额是按域名分配的,即来自同一域名的所有 Silverlight 应用程序共享该配额(尽管每个应用程序都有自己独立的隔离存储)。如果尝试超出此配额,将会引发异常。
为了处理可能的配额超出情况,在使用隔离存储时,应将代码放在 `try/catch` 块中。可以通过检查 `IsolatedStorageFile` 对象的 `AvailableFreeSpace` 属性来确定剩余的可用配额:
```csharp
long freeSpace = store.AvailableFreeSpace;
```
还可以通过 `store` 的 `Quota` 属性获取分配给域名的总配额,通过 `UsedSize` 属性获取已使用的配额。
当 Silverlight 应用程序安装为在浏览器外运行时,其配额将自动从初始的 1MB 增加到 25MB。若需要更多空间,可以随时请求。请求额外配额需要用户通过对话框给予许可,示例代码如下:
```csharp
bool increasePermitted = store.IncreaseQuotaTo(50 * 1024 * 1024);
```
该方法返回一个布尔值,指示用户是否允许增加额外空间。请求比已授予的配额小的配额将抛出 `ArgumentException` 异常,因此要将调用放在 `try/catch` 块中。需要注意的是,调用 `IncreaseQuotaTo` 方法必须源自用户发起的事件,此规则仅适用于应用程序在沙盒模式下运行时。
#### 3. 数据加密
将数据写入隔离存储时,需要注意数据的安全性。隔离存储的文件可以通过深入用户的配置文件文件夹轻松访问。在 Windows Vista/7 中,可以在资源管理器地址栏输入 `%userprofile%\AppData\LocalLow\Microsoft\Silverlight\is` 找到隔离存储区域。因此,不应将敏感数据写入隔离存储,若有安全需求,可以考虑对文件进行加密,相关指导可参考 [MSDN 文章](http://msdn.microsoft.com/en-au/library/dd153755(VS.95).aspx)。
#### 4. 数据压缩
由于默认配额仅为 1MB,根据要缓存的文件类型和数量,可考虑通过压缩文件来更有效地利用隔离存储的可用空间。Silverlight 没有内置的压缩例程,但可以使用开源库,如 `SharpZipLib` 和 `DotNetZip` 的 Silverlight 端口。`SharpZipLib` 采用 GPL 许可证,`DotNetZip` 采用限制较少的 Ms - PL 许可证。可以从 [http://slsharpziplib.codeplex.com](http://slsharpziplib.codeplex.com) 下载 `SharpZipLib` 的 Silverlight 端口,若下载 [Document Toolkit Extensions 项目](http://documenttoolkit.codeplex.com),可以找到这两个项目的 Silverlight 端口。
#### 5. 同步框架
Silverlight 的同步框架在编写本文时尚未可用,但值得关注。它用于在 Silverlight 应用程序和服务器之间同步数据,为偶尔连接的 Silverlight 应用程序提供了新的可能性。数据将保存在本地存储中,离线时应用程序可使用,上线后离线期间的数据更改将与服务器同步。其官方主页为 [http://msdn.microsoft.com/en-us/sync/default.aspx](http://msdn.microsoft.com/en-us/sync/default.aspx)。
#### 6. 客户端数据库缓存
隔离存储可用于在客户端缓存文件,但不适合缓存数据,与数据库提供的功能相比,它存在不足。Silverlight 没有内置的客户端数据库引擎,以下是一些可能的解决方案:
|数据库引擎|特点|获取地址|
| ---- | ---- | ---- |
|Sterling|轻量级面向对象数据库,使用可扩展二进制序列化引擎,维护键和表索引以实现快速
0
0
复制全文
相关推荐










