按理說,這個內容應該是不值得來說的,因為已經存在很多的方法來對類進行序列化。即使是自定義的序列化,也存在很多的方法。我們最常見的就是通過xml的xmlserializer方式來序列化。也可以使用iserializable這個介面來實現自動化的序列化。
即使是手工來寫序列化,每個人也會採用不同的方式。比如類xml的格式,或者json格式,還有其他的類似csv鍵值對等。所謂csv
是comma separated value(逗號分隔值)的英文縮寫,即記錄通過逗號來把所有的屬性值分割,解析的時候利用string.split方法快速建立屬性和值的關係。
現在來簡單的說明幾種序列化可能存在的問題。
現在我們要下面這個類,來進行字元方式的自定義序列化的演示。
class homeinfo
public string homename
public personinfo person
#endregion
#region 儲存
/// /// homeinfo進行自定義序列化值
///
///
///
public string serializevalue(char splitchar)
#endregion
}class personinfo
public int age
public string personprofile
#endregion
public string serializevalue(char splitchar)
}
由於類的屬性的值千差萬別,不能保證是否值中存在一些特殊字串或者字元。所以在儲存的時候我們對要儲存的資料進行轉義。比如我們打算用","來表示分割符,那麼上面的程式得到的結果就會存在問題。因為無法區分homeinfo和personinfo各自的逗號的位置。
比如測試**如下:
public static void test()
上面的問題出在屬性中包含了類要使用的分隔符,在這裡person屬性包含了homeinfo類使用的分隔符「,」,從而導致屬性值和本類的值無法區分。所以我們要做的是,如果屬性中已經存在乙個字元,那麼這個字元不能在被上層類使用了。
比如person屬性已經使用了",",那麼homeinfo就應該換一種風格符。要尋找可用的分隔符,可用先從特殊的可列印的字元開始。
char nsplitchars = new char ;如果這些特殊的字元在屬性中用到了,那麼就開始使用通用字元'a~z『,』a~z','0~9';一般來說不可能把所有的字元都用到了,總會有乙個合適的字元可用用來作為分隔符的。
比如person屬性中使用,作為分隔符,homeinfo使用;作為分隔符。
由於定義的分隔符是查詢出來的,所以必須在頭部新增乙個標籤標明分隔符是什麼。我會在最前面新增split:[具體的分隔符]來記錄。
我們重寫下homeinfo和personinfo的serializevalue函式
/// /// homeinfo進行自定義序列化值
///
///
public string serializevalue()
/// /// personinfo進行自定義序列化值
///
///
public string serializevalue()
其中stringsplithelper類能夠找到乙個為使用的字元作為分隔符,並組合成乙個字串。得到的最後結果是
split:&streetcode=10992&homename=tom's house&person=split:;name=tomas jim;age=42;personprofile=出生在美國的德州,從小喜歡養魚..愛好嘛..這個需要手工編輯下就可讀了。
//split:&
//streetcode=10992&
//homename=tom's house&
//person=
// split:;
// name=tomas jim;
// age=42;
// personprofile=出生在美國的德州,從小喜歡養魚..愛好嘛..
上面的person尋找到使用;使用分隔符,而homeinfo使用&使用分隔符。由此,自定義方式的序列化類方式的問題解決。至於讀,首先讀頭部的資訊,獲得分隔符,然後利用string.split的方法獲得屬性和值的對。依次到屬性,整個類的反序列化也就解決了。 可序列化和自定義序列化
序列化技術的主要兩個目的是 持久化儲存 按值封送。net framework支援三種序列化器 binary xml soap.他們各有優缺點,分別列如下 1.binary序列化是完全保真的,因為除非特殊宣告為nonserialized,那麼所有成員 包括私有的和公有的 都會被序列化。該序列化器的結果...
Serializable 自定義序列化
序列化物件可以自定義序列化,也可以使用預設序列化 如何選擇呢?這就要從序列化的目的說起,序列化的目的簡單來說就是儲存,之後可以還原,這就是說只要我們能達到這個目的,都是ok的。如果都ok那麼就可以選擇更ok的形式。看下面這個例子 oddnum 這是乙個極其沒有道理的例子,只是為了說明問題 publi...
自定義序列化物件
很多時候,我們需要將物件序列化成字串儲存到記憶體 磁碟或者 page.viewstate 中。基於種種原因,我們希望序列化結果盡可能小,盡可能簡單,即便用其他的方法 比如正規表示式 也能解析出資料。binaryformatter 的結果轉換成字串 或者base64 長度太大,而 xmlseriali...