C# 对象的序列化与反序列化 (DataContractJsonSerializer)

时间:2023-03-10 03:40:38
C# 对象的序列化与反序列化 (DataContractJsonSerializer)

项目引用

System.Runtime.Serialization.dll

添加命名空间

using System.Runtime.Serialization.Json;

1.序列化对象,得到Json字符串

        public static string WriteFromObject<T>(T obj) where T : class
{
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(T));
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
dcjs.WriteObject(ms, obj);

          //ms.Position = 0;
          //byte[] bt = new byte[ms.Length];
          //ms.Read(bt, 0, bt.Length);
          //return Encoding.Default.GetString(bt);

return Encoding.Default.GetString(ms.ToArray());
}
}

2.反序列化对象 ,从Json字符串中得到对象

        public static T ReadToObject<T>(string json) where T : class
{
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(T));
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Encoding.Default.GetBytes(json)))
{
return dcjs.ReadObject(ms) as T;
}
}

3.对象示例

/// 实现可序列化数据协定
[System.Runtime.Serialization.DataContract]
/// 识别方法返回类型
[System.Runtime.Serialization.KnownType("KnownType")]
public class ClassSample
{
/// 可被序列化成员
[System.Runtime.Serialization.DataMember]
public int DataMember { get; set; }
/// 枚举成员也要序列化
[System.Runtime.Serialization.EnumMember]
public Example EnumMember;
/// 非数据协定成员忽略序列化
[System.Runtime.Serialization.IgnoreDataMember]
public int IgnoreDataMember { get; set; }
/// 序列化时可缺少的字段
[System.Runtime.Serialization.OptionalField]
public int OptionalField; //反序列化后立即调用
[System.Runtime.Serialization.OnDeserialized]
//反序列化时调用
[System.Runtime.Serialization.OnDeserializing]
//在序列化该对象图后是否调用该方法
[System.Runtime.Serialization.OnSerialized]
//在对象序列化前调用此方法
[System.Runtime.Serialization.OnSerializing]
public KnownType KnownType()
{
return null;
}
}
[System.Runtime.Serialization.DataContract]
public enum Example
{ }
[System.Runtime.Serialization.DataContract]
public class KnownType
{ }