Json的序列化與反序列化以及亂入的k_BackingField
阿新 • • 發佈:2022-05-03
今天需要使用Json資料,所以用到了Json的序列化與反序列化。首先先來說怎麼序列化的:
1.序列化與反序列化
首先新增System.Runtime.Serialization的引用
Object轉換成Json檔案:
public static string ObjectToJson(object obj) { DataContractJsonSerializer ser = new DataContractJsonSerializer(obj.GetType()); using (MemoryStream ms = new MemoryStream()) { ser.WriteObject(ms, obj); return Encoding.Default.GetString(ms.ToArray()); } }
Json資料轉換成Object
public static T JsonToObject<T>(string json) where T : class { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(json))) { return (T)ser.ReadObject(ms); } }
程式比較簡單我就不多說了,剛開始實體類是這樣的:
[Serializable]
class User
{
public int Age { get; set; }
public string Name { get; set; }
public User(string name, int age)
{
Age = age;
Name = name;
}
}
然後呼叫:
static void Main(string[] args) { var user1 = new User("zhangsan", 18); var users = new List<User> { user1, new User("lisi", 23 ) }; var strUser1 = ObjectToJson(user1); var setUsers = ObjectToJson(users); }
加入斷點,檢視json資料,
居然莫名其妙出現了亂入的k__BackingField
2.亂入的k__BackingField的解決方案
從網上找了好多資料也沒搞明白是為啥會出現這個問題。想了解的可以參考下這個。不過找到了解決方案,這裡記錄下:
只需要將實體類改成如下形式:
[DataContract]
class User
{
[DataMember]
public int Age { get; set; }
[DataMember]
public string Name { get; set; }
public User(string name, int age)
{
Age = age;
Name = name;
}
}
再監視下就不會出現k__BackingField。Json資料轉換成實體的呼叫也很簡單:
static void Main(string[] args)
{
var user1 = new User("zhangsan", 18);
var users = new List<User> { user1, new User("lisi", 23 ) };
var strUser1 = ObjectToJson(user1);
var strUsers = ObjectToJson(users);
var user11 = JsonToObject<User>(strUser1);
var users1 = JsonToObject<List<User>>(strUsers);
}