什么是序列化?
System.Runtime.Serizlization 命名空间中实现了序列化的技术,序列化是将对象转换成线性字节,以便进行存储和传输,而反序列化是将序列化之后的有序字段转换成对象。
如何序列化一个对象?
1.创建一个流对象来保存序列化后的输出。
2.创建BinaryFormatter对象(位于:System.Runtimes.Serialization.Formatters.Binary命名空间)
3.调用BinaryFormatter.Serialize方法序列化并输出结果到流对象。
string data = "This must be stored in a file";
FileStream fs
= new FileStream(
"SerializedString.Data", FileMode
.Create);
BinaryFormatter bf
= new BinaryFormatter();
bf
.Serialize(fs,
data);
fs
.Close();
打开生成的文件SerializedString.data能够看到二进制的存储字符串内容
如何反序列化一个对象?
1.创建流对象以读取序列化输出。
2.创建BinaryFormatter对象。
3.创建新对象以存储反序列化后的对象。
4.调用BinaryFormatter.Deserialize方法以反序列化对象,转型成正确的类型。
FileStream fsm =
new FileStream(
"SerializedString.Data",FileMode.
Open);
BinaryFormatter bfr =
new BinaryFormatter();
string a = (
string)bfr.Deserialize(fsm);
Console.WriteLine(a);
fsm.Close();
如何创建可序列化的类?
1.只需要在类上面添加 [Serializable] 特性。标识可以序列化。
[Serializable]
class ShoppingCartItem
{
public int ProductId {
get;
set; }
public Decimal Price {
get;
set; }
[NonSerialized]
public string Name {
get;
set; }
public ShoppingCartItem(
int _productId,Decimal _price,
string _name)
{
ProductId = _productId;
Price = _price;
Name = _name;
}
}
引用命名空间
using System
using System
.Collections.Generic
using System
.IO
using System
.Linq
using System
.Runtime.Serialization.Formatters.Binary
using System
.Text
using System
.Threading.Tasks
using System
.Xml
using System
.Xml.Serialization
using System
.Runtime.Serialization.Formatters.Soap
将一个Object 序列化Json格式字符串
public string ObjectToJson(
object obj)
{
string jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
return jsonString;
}
XML文件序列化
#region 文件化XML序列化
public static void Save(
object obj,
string filename)
{
using (FileStream fs =
new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
{
XmlSerializer serializer =
new XmlSerializer(obj.GetType());
serializer.Serialize(fs, obj);
}
}
#endregion
XML文件反序列化
#region 文件化XML反序列化
public static object Load(Type type,
string filename)
{
using (FileStream fs =
new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
XmlSerializer serializer =
new XmlSerializer(type);
return serializer.Deserialize(fs);
}
}
#endregion
#region SoapFormatter序列化
public string ToSoap<T>(T item)
{
SoapFormatter formatter =
new SoapFormatter();
using (MemoryStream ms =
new MemoryStream())
{
formatter.Serialize(ms, item);
ms.Position =
0;
XmlDocument xmlDoc =
new XmlDocument();
xmlDoc.Load(ms);
return xmlDoc.InnerXml;
}
}
#endregion
#region SoapFormatter反序列化
public T FromSoap<T>(
string str)
{
XmlDocument xmlDoc =
new XmlDocument();
xmlDoc.LoadXml(str);
SoapFormatter formatter =
new SoapFormatter();
using (MemoryStream ms =
new MemoryStream())
{
xmlDoc.Save(ms);
ms.Position =
0;
return (T)formatter.Deserialize(ms);
}
}
#endregion
#region BinaryFormatter序列化
public string ToBinary<T>(T item)
{
BinaryFormatter formatter =
new BinaryFormatter();
using (MemoryStream ms =
new MemoryStream())
{
formatter.Serialize(ms, item);
ms.Position =
0;
byte[] bytes = ms.ToArray();
StringBuilder sb =
new StringBuilder();
foreach (
byte bt
in bytes)
{
sb.Append(
string.Format(
"{0:X2}", bt));
}
return sb.ToString();
}
}
#endregion
#region BinaryFormatter反序列化
public T FromBinary<T>(
string str)
{
int intLen = str.Length /
2;
byte[] bytes =
new byte[intLen];
for (
int i =
0; i < intLen; i++)
{
int ibyte = Convert.ToInt32(str.Substring(i *
2,
2),
16);
bytes[i] = (
byte)ibyte;
}
BinaryFormatter formatter =
new BinaryFormatter();
using (MemoryStream ms =
new MemoryStream(bytes))
{
return (T)formatter.Deserialize(ms);
}
}
#endregion
转载请注明原文地址: https://ju.6miu.com/read-970161.html