代码改变世界

XML、二进制、SOAP的序列化

  胖子  阅读(833)  评论(0编辑  收藏  举报

目的

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

 

区别

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

 

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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);
        }
    }
}
1
注意点
1
SOAP不能直接序列化List<T>这种类型的集合,但可以序列化数组[],所以序列化List<T>.ToArray()对象;
1
反序列化时,先强制转换为数组,然后再用数组构造List<T>
1
  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示