天天看點

Json.net說法——(三)回調方法修飾标簽

序列化回調方法修飾标簽

json.net支援序列化回調方法标簽。一個回調修飾标簽可以在序列化和反序列化對象前後控制對象。

OnSerializing

OnSerialized

OnDeserializing

OnDeserialized

通知序列化器在對象的序列化生命周期内要調用哪些方法,并用适合的标簽來修飾方法(序列化時,序列化後,反序列化時,反序列化後)。

參考類:Customer

public class Customer

{

//在序列化前後沒有變動

public int Unid { get; set; }

//在序列化前後設定和重置

public string CustomerName { get; set; }

//設定為null,但在序列化後填充

public string Memo { get; set; }

//忽略序列化,OnDeserializedAttribute标簽用于序列化之後設定一個值

[JsonIgnore]

public string Other { get; set; }

public Customer()

Unid = 11;

CustomerName = "宋江";

Other = "忽略序列化";

Memo = null;

}

[OnSerializing]

internal void OnSerializingMethod(StreamingContext context)

CustomerName = "在序列化時被寫入資料檔案";

[OnSerialized]

internal void OnSerializedMethod(StreamingContext context)

CustomerName = "序列化之後被指派";

[OnDeserializing]

internal void OnDeserializingMethod(StreamingContext context)

Other = "反序列化時被指派";

[OnDeserialized]

internal void OnDeserializedMethod(StreamingContext context)

Memo = "反序列化之後,被指派";

這個.net類有4個屬性:

·Unid,在序列化前後值沒有變化,且值不為null

·CustomerName,在序列化前後指派和重設值

·Memo,給null值

·Other,這個屬性忽略序列化。

public void SerializeCallbacks()

Customer customer = new Customer();

Console.WriteLine(customer.Unid);

Console.WriteLine(customer.CustomerName);

Console.WriteLine(customer.Memo);

Console.WriteLine(customer.Other);

/*

11

宋江

忽略序列化

 */

string json = JsonConvert.SerializeObject(customer, Formatting.Indented);

Console.WriteLine(json);

{"Unid": 11,"CustomerName": "在序列化期間被寫入資料檔案", "Memo": null}

 11

序列化之後被指派

分析:

(1)在沒有序列化時的值

輸出4個屬性的值,其中Memo值為null

(2)序列化之後

·Unid在序列化之前和之後沒有變化

·CustomerName,在序列化之前設定為“宋江”,但序列化之後變成了

“在序列化期間被寫入資料檔案”([OnSerializing])

·Memo為null值

·Other屬性被忽略

序列化之後,Customer對象的值:

·Unid沒有變化

·CustomerName,序列化之後,被重新設定值“序列化之後被指派”( [OnSerialized])

·Other,忽略序列化,值沒有變動

(2)反序列化

接上

之後:

customer = JsonConvert.DeserializeObject<Customer>(strJson);

在序列化時被寫入資料檔案

反序列化之後,被指派

反序列化時被指派 */

·CustomerName在序列化時,被指派“在序列化期間被寫入資料檔案”寫到資料檔案(生成了json),即json對象中的CustomerName值為“在序列化期間被寫入資料檔案”,在反序列化之後,得到了CustomerName屬性為這個值的對象

·Memo在反序列化之後被指派為“反序列化之後,被指派” [OnDeserialized]标簽

·Other屬性在序列化時是被忽略的,而即使這樣,因為[OnDeserializing]标簽的作用,使它在反序列化時被設定值“反序列化時被指派”

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園