「default關鍵字」與「序列化傳輸」的注意事項

2022-01-31 13:03:19 字數 1576 閱讀 8609

注:此乃「流水帳」式的水文,營養成分較低,高手請自動無視以下內容,否則引起消化不良等症狀等,一概不管 ^_^

c#自從3.0開始,提供了很多便捷的語法特性(俗稱「語法糖」),以簡化程式設計師的工作量,同時也讓程式設計變得更有樂趣,但是凡事有利必有弊。

比如我們有乙個類,希望能序列化成字串後,以string方式在silverlight與wcf(或其它後台程式設計技術)之間傳輸。

using system.io;

using system.text;

using system.xml.serialization;

namespace xmlclassserelizer

//這裡我們利用了"自動屬性"這一語法特性。

public string serialize()

catch

}return result;

}public void deserialize(string xmlstring)

}catch }}

}

在silverlight中的使用**,示例如下:

string strperson = new person().serialize();

生成的字串如下:

<?xml version="1.0" encoding="utf-8"?>

即:沒有或節點,如果希望生成乙個空的name節點,顯然這樣的結果不是您所期待的。

原因在於:

public string name

相當於

private string _name;

public string name get }

private string _name = default(string);        

public string name get }

而string在clr中的預設default值為null,在xml序列化的過程中,如果遇到屬性為null,不會生成該屬性的節點。

因此:若想在new乙個物件時,保證所有string型別的屬性,最終序列化時在xml結果中必須要有節點,上面的person類的name屬性**應該改成:

private string _name = "";        

public string name get }

這樣才有得到期望的xml字串:

<?xml version="1.0" encoding="utf-8"?>

最後,附上一些常用型別的預設default值:

//string s = default(string);//null

//datetime d = default(datetime);//0001/1/1 00:00:00

//bool b = default(bool);//false

//int i = default(int);//0

//double db = default(double);

//float f = default(float);

transient關鍵字和序列化方式

transient原理 通俗來說,就是將不需要序列化的屬性前新增transient關鍵字,在序列化的時候,有該關鍵字的屬性不會被序列化。序列化就是將物件的狀態儲存在硬碟上,在需要的時候讀出來使用。有些時候是不希望某個物件在網路上傳輸,寫入到磁碟中的,只希望它的生命週期存在記憶體中,就可以使用tran...

Default關鍵字的使用

default關鍵字在c 有兩種用法,一是用在switch語句中,二是用在泛型中。兩種用法分別如下 1 在switch語句中,如果沒有任何 case 表示式與開關值匹配,則控制傳遞給跟在可選 default標籤後的語句。如果沒有 default標籤,則控制傳遞到 switch 以外。2 在泛型類和泛...

C 中default關鍵字用法簡介

c 中default關鍵字可根據上下文有多種含義。switch語句中使用default處理非case匹配的預設情況。在泛型中使用default,取決於泛型型別是引用型別還是值型別,引用型別的default將泛型型別初始化null,值型別的default將泛型型別初始化為0。在型別應用中可以通過def...