silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Silverlight中的序列化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

序列化简言之是这样一种能力:能够把复杂的对象(Object)变成某种格式的字符串(常见的格式有xml,String,二进制文件等),这样可以方便的在各种系统中传输或交换(比喻socket编程中的数据包只能用byte[]传输),接收方得到该字符串后,通过反序列化可以还原为复杂对象,进而调用对象的方法或属性 -- 跟反射有点沾边:) 这里先给出一个WinForm的序列化例子,功能为通过打开文件对话框选


序列化简言之是这样一种能力:能够把复杂的对象(Object)变成某种格式的字符串(常见的格式有xml,String,二进制文件等),这样可以方便的在各种系统中传输或交换(比喻socket编程中的数据包只能用byte[]传输),接收方得到该字符串后,通过反序列化可以还原为复杂对象,进而调用对象的方法属性 -- 跟反射有点沾边:)

这里先给出一个WinForm的序列化例子,功能为通过打开文件对话框选择一个文件后,构造一个复杂对象,然后序列化为二进制格式,得到该格式后,再反序列化(还原)为复杂对象

Silverlight中的序列化

Winform中的序列化
  1  using  System;
  2   System.IO;
  3   System.Runtime.serialization;
  4   System.Runtime.serialization.Formatters.binary;
  5   System.Text;
  6   System.Windows.Forms;
  7 
  8  namespace  serializestudy
  9  {
 10       public   partial class  Form1 : Form
 11      {
 12            Form1()
 13          {
 14              initializeComponent();
 15          }
 16   17  private void  btnserialize_Click( object  sender, EventArgs E)
 18   19              OpenFileDialog opendlg  = new  OpenFileDialog();
 20               if  (opendlg.ShowDialog()  ==  DialogResult.oK)
 21              {
 22   23                   #region  得到一个包含"文件内容"的Msg对象  24                  Msg msg   Msg();
 25                  msg.ReceiverName    " jimmy " ;
 26                  msg.SenderName  yjmyzy  27                  msg.Type   messageType.file;
 28                  FileStream fs   opendlg.openFile()  as  FileStream;
 29                  msg.body  byte [fs.Length];
 30                  fs.Read(msg.body,  0 , msg.body.Length);
 31                  fs.Close();
 32  #endregion  33   34   将Msg对象序列到内存流中  35                  MemoryStream ms   MemoryStream();
 36                  BinaryFormatter binaryFormatter   BinaryFormatter();
 37                  binaryFormatter.serialize(ms, msg);
 38   39   40   再将内存流转化为byte[]  41  [] arrMsg   ms.ToArray();
 42                  ms.Close();
 43   44   45                  messageBox.Show( 序列化成功! );
 46   47                  StringBuilder sb   StringBuilder();
 48   49  for  ( int  i  ; i  <  arrMsg.Length; i ++ )
 50                  {
 51                      sb.Append(arrMsg[i].ToString()  + :12px; line-height:1.5; color:rgb(0,  52                  }
 53   54                  textBox1.Text   sb.ToString().Trim( ' '  55              }
 56   57   58   btnDeserialize_Click(  59   60   (textBox1.Text.Trim().Length  {  return ; }
 61   62   先将textBox1中的内容变成byte[]  63  String  textBox1.Text.Trim().Split(  64  [] arrBin  [arrMsg.Length];
 65   66   67   68                  arrBin[i]  .Parse(arrMsg[i]);
 69   70   71   72  try  73   74                  IFormatter formatter   75   MemoryStream(arrBin);
 76   formatter.Deserialize(ms)   Msg;
 77   78   (msg  != null  79   80                      messageBox.Show( 反序列化成功!  msg.ReceiverName   msg.SenderName   msg.TypE);
 81   82   83   84  catch  (Exception eX)
 85   86                  messageBox.Show(ex.message.ToString());
 87   88   89      }
 90   91   92   93       /// <sumMary>  94   消息格式
 95  </sumMary>
 96      [serializable]
 97  enum  messageType
 98   99          txt,
100          img,128)">101          file,128)">102          unkNown
103  104  105  106   消息对象
107  108  109   Msg
110  111   messageType _type   messageType.unkNown;
112   messageType Type
113  114  set  { _type   value; }
115  get  {   _type; }
116  117  118   SenderName {  119   receiverName {  120  [] Body {  121  122  123  }
124 

不过在Silverlight中,传统的序列化方式有很多被精减掉了(比如BinaryFormatter之类),唯一得以保存的只剩下System.Xml.serialization,所以SL中只能通过xml来序列化对象(然xml序列化后的字节数相对Binary有点大,不过我们也别无选择),另外有一点很让人不习惯的是,需要序列化的自定义类中,居然不需要加[serializable],[DataMember]这类标记!(这一点让我郁闷了好久,还为此在网上疯狂的百度,google为啥sl中不识别serializable)

1.先定义一个需要序列化的类

Silverlight中的序列化

@H_601_696@自定义
namespace  serializeDemo
{
    
///   <sumMary>
    
 聊天室消息对象
    
</sumMary>         
     public   class  Chatmessage
    {
        
String  SenderName {  set get ; }

        
 receiverName {   messageType Type {  byte [] Body {  enum  messageType { 
            txt,img,file,unkNown
        }
       
    }
}

 

2.序列化/反序列化代码示例:

Xaml部分:

Xaml
< UserControl  x:Class ="serializeDemo.MainPage"
    xmlns
="http://scheR_497_11845@as.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://scheR_497_11845@as.microsoft.com/winfx/2006/xaml"
    xmlns:d
="http://scheR_497_11845@as.microsoft.com/expression/blend/2008"  xmlns:mc ="http://scheR_497_11845@as.openxmlformats.org/markup-compatibility/2006"  
    mc:Ignorable
="d"  d:DesignWidth ="640"  d:DesignHeight ="480" >
  
Grid  x:Name ="LayoutRoot"
      
Grid.RowDeFinitions
          
RowDeFinitio Height ="30" /> ="*" </ StackPanel  HorizontalAlignment ="Center"  Orientation ="Horizontal" Button  ="btnserialize"  Content ="序列化"  Width ="80"  Height ="24"  Click ="btnserialize_Click" ="btnDeserialize" ="反序列化"  Margin ="10,0" ="btnDeserialize_Click" StackPanel TextBox  Grid.Row ="1"  text ="TextBox"  textwrapping ="Wrap"   d:LayoutOverrides ="Height"  x:Name ="txtResult"         
  
Grid
UserControl >

Xaml.cs部分:

Silverlight中的序列化

@H_601_696@Xaml.cs
using  System;
 System.IO;
 System.Text;
 System.Windows;
 System.Windows.Controls;
 System.Xml.serialization;

 serializeDemo
{
    
partial  MainPage : UserControl
    {
        
 MainPage()
        {
            initializeComponent();
        }

        
private void  btnserialize_Click( object :12px; line-height:1.5; color:rgb(0, routedEventArgs E)
        {
            
#region  得到一个复杂对象
            Chatmessage msg 
= new  Chatmessage();
            msg.ReceiverName 
" jimmy " ;
            msg.SenderName 
yjmyzy ;
            msg.Type 
 Chatmessage.messageType.file;
            msg.body 
[] {  0 :12px; line-height:1.5; color:rgb(0,  1  };
            
#endregion

            MemoryStream ms 
 MemoryStream();
            Xmlserializer xml 
 Xmlserializer( typeof (ChatmessagE));
            
try
            {
                xml.serialize(ms, msg);
// 将对象序列化为流                  [] ar  ms.ToArray();
                StringBuilder sb 
 StringBuilder();
                
for  ( int  i  ; i  <  arr.Length; i ++ )
                {
                    sb.Append(arr[i].ToString() 
+ :12px; line-height:1.5; color:rgb(0, );    
                }
                txtResult.Text 
 sb.ToString().Trim( ' ' );
            }
            
catch  (Exception eX) 
            {
                txtResult.Text 
 ex.message.ToString();
            }
        }

        
 btnDeserialize_Click( if  (txtResult.Text.Trim().Length  == {  return ; }
            
 先将txtResult中的内容变成byte[]
            
[] arrMsg   txtResult.Text.Trim().Split( );
            
[] arrBin  [arrMsg.Length];

            
 arrMsg.Length; i )
            {
                arrBin[i] 
.Parse(arrMsg[i]);
            }
            

            MemoryStream ms 
 MemoryStream(arrBin);
            Xmlserializer xml 

            {
                Chatmessage msg 
 xml.Deserialize(ms)  as  Chatmessage; 反序列化为Chatmessage对象  (msg  != null )
                {
                    txtResult.Text 
反序列化成功!  msg.ReceiverName   msg.SenderName   msg.Type.ToString();
                }
            }
            
 ex.message.ToString();
            }            
        }
    }
}

 

作者: 菩提树下的杨过
出处: http://yjmyzz.cnblogs.com  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

大佬总结

以上是大佬教程为你收集整理的Silverlight中的序列化全部内容,希望文章能够帮你解决Silverlight中的序列化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。