WPF/Silverlight 中利用XamlReader /Writer 来处理对象的序列化反序列化

在 Silverlight 中,有几种获取后台数据的方式。 通过会有一个Service来暴露这些数据,对于sl2 这个service可以是最简单的ASMX或者用WCF的basichttpbinding, 您可以通过添加引用来生成代理,来适用这个service。

 

如果只是简单的数据的话,你也可以通过访问一个远程的XML文件来获取这些数据,拿到XML之后,需要把他转换成对象。也有几种方式

  • 用xmlReader
  • 用LinqForXml
  • 用系统解析XAML的方式,也就是本文中提到的方式。其实是最简单的一种方式。

思路:

首先定义个对像,我们知道在WPF/Silverlight 的class Resource中可以加入资源,资源可以是任意的对象。

而在程序中,可以通过访问资源Key的方式拿到这些对象。事实上,他拿这些对象的时候,就是适用一个简单的XamlReader来反序列化之。

 

一下是一个简单的Demo

 

假定有一下Class

 

ContractedBlock.gif ExpandedBlockStart.gif Code
namespace WpfApplication1
{
    
public class Person
    {
        
public int Age { getset; }
        
public string Name { getset; }
        
        
public Address ShippingAddress {get;set;}

    }


    
public class Address
    {
        
public string FirstLine { getset; }
        
public int Zipcode { getset; }
    }
}

 

这时候你可以在resource中,加上一个自己的xmlns前缀,指向这个class所有的namespace和assembly

比如在Xaml中你可以这样些,这时候有很好的智能提示。

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<Application x:Class="WpfApplication1.App"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri
="Window1.xaml"
             xmlns:Obj
="clr-namespace:WpfApplication1">
    
<Application.Resources>
        
<Obj:Person x:Key="hello">
            
<Obj:Person.Name>Hello</Obj:Person.Name>
            
<Obj:Person.Age>30</Obj:Person.Age>
            
<Obj:Person.ShippingAddress>
                
<Obj:Address>
                    
<Obj:Address.FirstLine>FirstLine</Obj:Address.FirstLine>
                    
<Obj:Address.Zipcode>91792</Obj:Address.Zipcode>
                
</Obj:Address>
            
</Obj:Person.ShippingAddress>
        
</Obj:Person>
    
</Application.Resources>
</Application>

 

然后我们新建一个xml文件,把我们写好的xaml copy进去。删掉一些不必要的属性,不如Key。 和 class

变成一下xml

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<?xml version="1.0" encoding="utf-8" ?>
<Obj:Person xmlns:Obj="clr-namespace:WpfApplication1;assembly=WpfApplication1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
  
>
  
<Obj:Person.Name>Hello</Obj:Person.Name>
  
<Obj:Person.Age>30</Obj:Person.Age>
  
<Obj:Person.ShippingAddress>
    
<Obj:Address>
      
<Obj:Address.FirstLine>FirstLine</Obj:Address.FirstLine>
      
<Obj:Address.Zipcode>91792</Obj:Address.Zipcode>
    
</Obj:Address>
  
</Obj:Person.ShippingAddress>
</Obj:Person>

 

然后用一下简单的代码就可以反序列化得到对象的访问。

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
  XamlReader readr = new XamlReader();
            Person o
=readr.LoadAsync(
                
new System.IO.FileStream(
                    
@"r:\WpfApplication1\WpfApplication1\XMLFile1.xml",
                    FileMode.Open      )) 
as Person;
            ;

 

如果是Sl, 把LoadAsyc改为Load就可以了。

如果正式应用的话,可以把Xml放在服务端,然后通过webclient download,然后调用以上代码做反序列化。

 

然后你就可以做正常的binding,Animation了,当然要正常工作的话,属性要改为DependencyProperty

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值