zoukankan      html  css  js  c++  java
  • XML、二进制、SOAP的序列化

    目的

    将对象序列化之后,可以以文件的形式保存下来。

    区别

      XML 二进制 SOAP
    序列化类 XmlSerializer BinaryFormatter SoapFormatter
    SerializableAttribute 标记 不需要 需要 需要
    ISerializable 接口 不需要 需要 需要
    无参构造函数 必须有 不需要 不需要
    被序列化的数据成员属性 public all all
    序列化后的大小

    实现

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Runtime.Serialization.Formatters.Soap;
    using System.Xml.Serialization;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main( string[] args )
            {
                SerializeByXml();
                SerializeByBinary();
                SerializeBySoap();
            }
    
            static void SerializeByXml()
            {
                string filePath = @"b:\XmlSerializer.dat";
    
                if( !File.Exists( filePath ) )
                {
                    List<Product> list1 = new List<Product>();
                    for( int i = 1; i <= 10; i++ )
                        list1.Add( new Product { ProductID = i, ProductName = "产品名称_xml_" + i } );
    
                    XmlSerializer xsSerialize = new XmlSerializer(typeof (List<Product>));
                    using( Stream fsWrite = new FileStream( filePath, FileMode.Create, FileAccess.Write, FileShare.None ) )
                    {
                        xsSerialize.Serialize( fsWrite, list1 );
                        fsWrite.Close();
                    }
                }
    
                List<Product> list2;
                XmlSerializer xsDeserialize = new XmlSerializer( typeof( List<Product> ) );
                using( Stream fsRead = new FileStream( filePath, FileMode.Open, FileAccess.Read, FileShare.None ) )
                {
                    list2 = (List<Product>)xsDeserialize.Deserialize( fsRead );
                    fsRead.Close();
                }
                foreach( Product p in list2 )
                {
                    Console.WriteLine( p );
                }
            }
    
            static void SerializeByBinary()
            {
                string filePath = @"b:\BinarySerializer.dat";
    
                if( !File.Exists( filePath ) )
                {
                    List<Product> list1 = new List<Product>();
                    for( int i = 1; i <= 10; i++ )
                        list1.Add( new Product { ProductID = i, ProductName = "产品名称_binary_" + i } );
    
                    BinaryFormatter xsSerialize = new BinaryFormatter();
                    using( Stream fsWrite = new FileStream( filePath, FileMode.Create, FileAccess.Write, FileShare.None ) )
                    {
                        xsSerialize.Serialize( fsWrite, list1 );
                        fsWrite.Close();
                    }
                }
    
                List<Product> list2;
                BinaryFormatter xsDeserialize = new BinaryFormatter();
                using( Stream fsRead = new FileStream( filePath, FileMode.Open, FileAccess.Read, FileShare.None ) )
                {
                    list2 = (List<Product>)xsDeserialize.Deserialize( fsRead );
                    fsRead.Close();
                }
                foreach( Product p in list2 )
                {
                    Console.WriteLine( p );
                }
            }
    
            static void SerializeBySoap()
            {
                string filePath = @"b:\SoapSerializer.dat";
    
                if( !File.Exists( filePath ) )
                {
                    List<Product> list1 = new List<Product>();
                    for( int i = 1; i <= 10; i++ )
                        list1.Add( new Product { ProductID = i, ProductName = "产品名称_soap_" + i } );
    
                    SoapFormatter xsSerialize = new SoapFormatter();
                    using( Stream fsWrite = new FileStream( filePath, FileMode.Create, FileAccess.Write, FileShare.None ) )
                    {
                        xsSerialize.Serialize( fsWrite, list1.ToArray() );
                        fsWrite.Close();
                    }
                }
    
                List<Product> list2;
                SoapFormatter xsDeserialize = new SoapFormatter();
                using( Stream fsRead = new FileStream( filePath, FileMode.Open, FileAccess.Read, FileShare.None ) )
                {
                    list2 = new List<Product>( (Product[])xsDeserialize.Deserialize( fsRead ) );
                    fsRead.Close();
                }
                foreach( Product p in list2 )
                {
                    Console.WriteLine( p );
                }
            }
        }
    
        [Serializable]
        public class Product
        {
            public int ProductID { get; set; }
            public string ProductName { get; set; }
    
            public override string ToString()
            {
                return string.Format("ProductID:{0}\t\tProductName:{1}", ProductID, ProductName);
            }
        }
    }
    
    注意点
    SOAP不能直接序列化List<T>这种类型的集合,但可以序列化数组[],所以序列化List<T>.ToArray()对象;
    反序列化时,先强制转换为数组,然后再用数组构造List<T>
     
  • 相关阅读:
    [Outlook] Outlook2013能收但无法发送邮件-0x800CCC13, 0x800CCC0B, 0x8004210B
    [Mobile] 手机浏览器输入框-数字输入框
    [Qcon] 百姓网开发总结
    [QCon] Scrum阅读随想
    [Spring] 事务级别定义
    [Monitor] 监控规则定义
    [Spring Batch] 图解Spring Batch原理
    [JavaCore] 微信手机浏览器版本判断
    Python 编码简单说
    矩阵或多维数组两种常用实现方法
  • 原文地址:https://www.cnblogs.com/freemantc/p/1672616.html
Copyright © 2011-2022 走看看