C 再談序列化和反序列化

2021-09-30 10:05:53 字數 3113 閱讀 8346

public iqueryablegetv_storewhere(expression> predicate)

1.1序列化成檔案

1.1.1 二進位制的序列化和反序列化

//序列化

myobject obj = new myobject();

obj.n1 = 1;

obj.n2 = 24;

obj.str = "一些字串";

iformatter formatter = new binaryformatter();

stream stream = new filestream("myfile.bin", filemode.create,

fileaccess.write, fileshare.none);

formatter.serialize(stream, obj);

stream.close();

//反序列化

iformatter formatter = new binaryformatter();

stream stream = new filestream("myfile.bin", filemode.open,

fileaccess.read, fileshare.read);

myobject obj = (myobject) formatter.deserialize(fromstream);

stream.close();

1.1.2 xml序列化和反序列化

上面的**換成soapformatter即可以生成xml

1.2選擇性序列化

[serializable]

public class myobject

set}

注意:當類成員變數**現不能被序列化的類或介面時候我們要通過

[nonserialized]   只針對成員變數

[xmlignore]   針對成員變數和屬性,只針對xml序列化

標記其不被序列化和反序列化

特別注意:要使某屬性在xml序列化過程中不被序列化只能使用[xmlignore],[nonserialized]無效

2>自定義序列化

為了解決1中序列化過程中會出現某些成員變數序列化過程中資料丟失的顯現,

可採用自定義的序列化

[serializable]

public class myobject : iserializable

protected myobject(serializationinfo info, streamingcontext context)

public virtual void getobjectdata(serializationinfo info, streamingcontext context)

}其派生類也必須實現上面的介面方法

[serializable]

public class objecttwo : myobject

protected objecttwo(serializationinfo si, streamingcontext context) : base(si,context)

public override void getobjectdata(serializationinfo si, streamingcontext context)

}切記要在反序列化建構函式中呼叫基類,否則,將永遠不會呼叫基類上的建構函式,並且在反序列化後也無法構建完整的物件。

3>web 服務中的序列化

web 服務返回物件時候會自動把該物件進行xml序列化

因此,乙個類要想在web 服務上傳遞必須可xml序列化

public class test : webservice

//通過xmlinclude宣告序列化過程中相關的類資訊

[webmethod()]

[xmlinclude(typeof(car)), xmlinclude(typeof(bike))]

public vehicle vehicle(string licensenumber)

else if (licensenumber == "1")

else }}

//通過xmlroot指定序列化的root描述資訊

[xmlroot("newvehicle")]

public abstract class vehicle

public class car : vehicle

public class bike : vehicle

4>兩個通用的序列化函式------來自enterprise lib 配置模組

public override object serialize(object value)

finally

return doc.documentelement;

}public override object deserialize(object section)

xmlattribute typeattribute = serializationnode.attributes["type"];

if (typeattribute == null)

string typename = typeattribute.value;

type classtype = null;

trycatch (typeloadexception ex)

catch (filenotfoundexception ex)

if (serializationnode.childnodes.count == 0)

xmlserializer xs = createxmlserializer(classtype);

trycatch (invalidoperationexception e)

throw new configurationexception(message, e);}

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...

C 序列化和反序列化

binaryserialize serialize new binaryserialize book book serialize.deserialize book.write 3 測試用的 binaryserialize類 using system using system.collections...

C 序列化和反序列化

對stu類進行序列化和反序列化操作序列化所用到的stu類using system using system.collections.generic using system.linq using system.text public string stuname public int stuage ...