惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
宝玉的分享
宝玉的分享
美团技术团队
量子位
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
爱范儿
爱范儿
J
Java Code Geeks
博客园 - Franky
Last Week in AI
Last Week in AI
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
GbyAI
GbyAI
Recent Announcements
Recent Announcements
小众软件
小众软件
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog

博客园 - 黑羽飘舞

挥别虎年,迎来兔年 评论:B2Cer,其实您既不电子,也不商务 整理思路重新开始,一段乱七八糟的“电子商务创业”经历。--工作有风险,选公司要谨慎 什么是电子商务的核心竞争力 Subtext分析3-Subtext.Akismet [转]JSON序列化与反序列化 [转]WCF一个Host实现多契约服务 [转]WCF分布式事务 抽象类,接口,委托与事件 Subtext分析2-Subtext.BlogML Subtext分析1-前言架构 博客园的管理团队都在做什么,博客园是个大杂烩么? 项目那点儿事---山寨篇(注释不是程序员的负担) 我的2008,感谢2008,挥别2008 文档知多少---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十五)[转] 葵花点穴手 定---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十四)[转] 八部众---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十三)[转] 波、波、波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二)[转] 我要飞的更高---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十一)[转]
[转]序列化与反序列化,及Json序列化反序列化
黑羽飘舞 · 2010-05-23 · via 博客园 - 黑羽飘舞

转自:http://www.cnblogs.com/jams742003/

序列化是将对象状态转换为可保持或可传输的格式的过程,反序列化则过程相反。用于存储和传输数据。

(一)asp.net序列化与反序列化

.net提供多种序列化类

1BinaryFormatter

名字空间:System.Runtime.Serialization.Formatters.Binary

这个类用于以二进制格式将对象或整个连接对象图形序列化和反序列化

构造器两个:

BinaryFormatter()
BinaryFormatter(ISurrogateSelector, StreamingContext)

介绍它的两个主要方法:

1 Serialize方法

将对象或连接对象图形序列化为给定流

它有两个重载:

Serialize(Stream, Object)
Serialize(Stream, Object,Header[])

Customer

public class Customer
{
    
public int Unid { getset; }
    
public string Name { getset; }
    
public string Call { getset; }
}

下边通过示例来测试序列化方法Serialize

public void TestSerialize()
{
    Customer customer 
= new Customer {Unid=1,Name="宋江",Call="89589689" };
    FileStream fs 
= new FileStream("test.dat", FileMode.Create); 

    BinaryFormatter formatter 

= new BinaryFormatter();
    
try
    {
        formatter.Serialize(fs, customer);
    }
    
catch
    { }
    
finally
    {
        fs.Close();
    }
}

测试时,这个会抛出异常:类型“SerializeTest.Customer”未标记为可序列化。所以要在Customer类上添加修饰标签

[Serializable]
public class Customer

测试,在bin\debug文件夹中可以看到test.dat文件。

2 Deserialize方法

将流反序列化为对象图形,它也有两个重载

Deserialize(Stream) 
Deserialize(Stream, HeaderHandler)

通过示例来测试从流进行反序列化 

public void TestDeserialize()
{

    Customer customer 

= new Customer();
    FileStream fs 
= new FileStream("test.dat", FileMode.Open);

    BinaryFormatter formatter 

= new BinaryFormatter();
    customer
= formatter.Deserialize(fs) as Customer;
    fs.Close();

    Console.WriteLine(customer.Name);
}

结果输出:宋江

2SoapFormatter

名字空间:System.Runtime.Serialization.Formatters.Soap

SOAP 格式将对象或整个连接对象的图形序列化和反序列化。

SOAP就是simple object access protocol的缩写,简单对象传输协议。是一种轻量的,简单的,基于xml的协议。

这个要添加对System.Runtime.Serialization.Formatters.Soap.dll的引用

构造器:

SoapFormatter xx=new  SoapFormatter()
SoapFormatter(ISurrogateSelector, StreamingContext)

主要介绍其中2个方法

1 Serialize方法

Serialize(Stream, Object) 
Serialize(Stream, Object, Header[]

public void TestSoapSerialize()
{
    Customer customer 
= new Customer { Unid = 1, Name = "宋江", Call = "89589689" };

    FileStream fs 

= new FileStream("soaptest.dat", FileMode.Create);
    SoapFormatter formatter 
= new SoapFormatter();
    
try
    {
        formatter.Serialize(fs, customer);
    }
    
catch
    { }
    
finally
    {
        fs.Close();
    }
}

打开bin\debug中的soaptest.dat文件,这就是soap格式。

2 Deserialize方法

反序列化soap格式

Deserialize(Stream) 
Deserialize(Stream, HeaderHandler)

其它的不多说了。

public void TestSoapDeserialize()
{
    Customer customer 
= new Customer();
    FileStream fs 
= new FileStream("soaptest.dat", FileMode.Open);
    SoapFormatter formatter 
= new SoapFormatter();
    customer 
= formatter.Deserialize(fs) as Customer;
    fs.Close();

    Console.WriteLine(customer.Name);
}

3XmlSerializer

将对象序列化到 XML 文档中和从 XML 文档中反序列化对象

名字空间:System.Xml.Serialization

构造方法太多,不列举了,可以参考帮助

1 Serialize方法

拿出一个来说:

public void Serialize(XmlWriter xmlWriter,Object o)

public void TestXmlSerialize()
{
    Customer customer 
= new Customer { Unid = 1, Name = "宋江", Call = "89589689" };

    FileStream fs 

= new FileStream("xmltest.xml", FileMode.Create);
    XmlSerializer formatter 
= new XmlSerializer(typeof(Customer));
    formatter.Serialize(fs, customer);

    fs.Close();
}

结果可以到debug\bin里查看。

2 Deserialize方法 

public void TestXmlDeserialize()
{
    Customer customer 
= new Customer();
    FileStream fs 
= new FileStream("xmltest.xml", FileMode.Open);
    XmlSerializer formatter 
= new XmlSerializer(typeof(Customer));
    customer 
= formatter.Deserialize(fs) as Customer;
    fs.Close();

    Console.WriteLine(customer.Name);
}

(二)Json序列化与反序列化

Json相关可见:

http://www.cnblogs.com/jams742003/category/225387.html

Json序列化和反序列化指的是:对象序列化为JSON,并可用于从 JSON 反序列化对象

.net 3.5

名字空间:System.Runtime.Serialization.Json

但程序集是: System.ServiceModel.Web.dll

1DataContractJsonSerializer

构造方法很多。

介绍这个类其中2个方法:

1 WriteObject方法

有好种重载,这里测试一个:

public override void WriteObject(Stream stream,Object graph)

测试:

public void TestJsonSerialize()
{

    Customer customer 

= new Customer { Unid = 1, Name = "宋江", Call = "89589689" };
    DataContractJsonSerializer ds 
= new DataContractJsonSerializer(typeof(Customer)); 

    FileStream fs 

= new FileStream("json.txt", FileMode.Create);
    ds.WriteObject(fs, customer);
    fs.Close();
}

进行Json序列化时,类型不必添加修饰标签

bin\debug里可以看到json串。

有关json串请见:

http://www.cnblogs.com/jams742003/archive/2009/12/29/1634764.html

2 ReadObject方法

重载很多。

public override Object ReadObject(Stream stream)

测试:

public void TestJsonDeserialize()
{
    DataContractJsonSerializer ds 
= 
        
new DataContractJsonSerializer(typeof(Customer)); 

    FileStream fs 

= new FileStream("json.txt", FileMode.Open);
    var cc 
= ds.ReadObject(fs);
    fs.Close();
}

2JavaScriptSerializer

为启用 AFAX 的应用程序提供序列化和反序列化功能

名字空间:System.Web.Script.Serialization

程序集:System.Web.Extensions(在 System.Web.Extensions.dll 中)

说其中2个方法

1 Serialize方法 

Serialize(Object)
Serialize(Object, StringBuilder)

public void TestJsSerialize()
{
    Customer customer 
= new Customer { Unid = 1, Name = "宋江", Call = "89589689" };
    JavaScriptSerializer js 
= new JavaScriptSerializer(); 

    Console.WriteLine(js.Serialize(customer));
}

输出串:{"Unid":1,"Name":"宋江","Call":"89589689"}

2 Deserialize方法

public void TestJsDeserialize()
{
    
string str = File.ReadAllText("jsjson.txt");
    JavaScriptSerializer js 
= new JavaScriptSerializer();
    Customer customer 
= js.Deserialize<Customer>(str); 

    Console.WriteLine(customer.Name);
}

3Json.net

这是一个第三方工具

请见:http://www.cnblogs.com/jams742003/archive/2009/11/04/1595737.html

名字空间:Newtonsoft.Json

添加Newtonsoft.Json.dll程序集

其中2个方法: 

1 SerializeObject方法

public void TestJsonnetSerialize()
{
    Customer customer 
= new Customer { Unid = 1, Name = "宋江", Call = "89589689" };
    
string strJson=JsonConvert.SerializeObject(customer);
    StreamWriter sw 
= File.CreateText("jsonnet.txt");
    sw.Write(strJson);

    sw.Close();
}

2 DeserializeObject方法

public void TestJsonnetDeserialize()
{
    
string str = File.ReadAllText("jsonnet.txt");
    Customer customer 
= JsonConvert.DeserializeObject<Customer>(str);
    Console.WriteLine(customer.Name);
}

更多关于json.net的请见:

http://www.cnblogs.com/jams742003/archive/2009/11/04/1595737.html