C socket傳輸自定義物件

2021-06-20 08:15:49 字數 3404 閱讀 7199

之前研究過自定義物件的socket傳輸,當時認識太淺了,實在是無法理解,現在重新研究了一次,除錯通過,僅作為記錄筆記。

c#中,目前我所知道的序列化與反序列化有兩種,當然有更多,但是我還沒有去認識。

這兩種序列化方式分為:

system.runtime.serialization.formatters.binary空間下的binaryformatter。

system.runtime.serialization空間下的datacontractserializer。

第一種序列化就我目前認知來看,不能作為不同工程之前的序列化操作,也就是說不同命名空間下的程式序列化出來的資訊不能共享,我嘗試著在乙個工程中序列化資料,然後使用socket傳輸給第二個工程來反序列化,結果報錯,報錯的大致意思就是說我序列化的內容在我反序列化的時候不能找到精確的型別來匹配,想想也是,序列化和反序列化實在兩個不同的工程中,命名空間和類的定義都不一樣,反正沒有深究。

第二種序列化不用擔心這個問題,因為datacontractserializer在初始化的時候必須要傳遞乙個引數來實現構造,這個引數就是我將做的序列化操作對應的類的型別是什麼,這樣的話,我根本就不用擔心型別匹配的問題。但是有一點要注意的是,datacontractserializer沒有在預設的這個空間中,需要引用system.runtime.serialization.dll才可以使用這個函式。

第一種方式的序列化和反序列化:

[c-sharp]view plain

copy

print?

public stream serializestream_sameproject(object param)  

[c-sharp]view plain

copy

print?

public stream serializestream_sameproject(object param)   

[c-sharp]view plain

copy

print?

public

object deserializestream_sameproject(stream stream)  

[c-sharp]view plain

copy

print?

public

object deserializestream_sameproject(stream stream)   

第二種方式的序列化和反序列化:

[c-sharp]view plain

copy

print?

public stream serializestream(object param)  

[c-sharp]view plain

copy

print?

public stream serializestream(object param)   

[c-sharp]view plain

copy

print?

public

object deserializestream(stream stream,type paramtype)  

[c-sharp]view plain

copy

print?

public

object deserializestream(stream stream,type paramtype)   

關於socket傳輸物件的辦法,使用第二種序列化,將物件轉換為byte陣列,使用socket傳輸過去。

接收方接收到陣列之後,又將陣列反序列化回物件。

傳輸過程中的物件必須傳輸方和接收方都可以識別。

序列化的類必須以[serializable]標明。

最近無聊在寫個傳輸的東西,發現個問題,現在補充一下,2012-01-30

如果傳輸的物件的型別中有其他的型別,而這些型別並沒有被申明的話,那麼在執行writeobject的時候會報錯,因為編譯器認為型別不明確或者不認識。

這個時候需要為序列化的型別進行型別申明。

[csharp]view plain

copy

print?

[datacontract] 

[knowntype(typeof(bitmap))] 

public

class imagedata : contractdata

[datamember] 

public image image

[datamember] 

public

int index

[csharp]view plain

copy

print?

[datacontract] 

[knowntype(typeof(bitmap))] 

public

class imagedata : contractdata 

[datamember] 

public image image  

[datamember] 

public

int index  

[csharp]view plain

copy

print?

例如上面這個型別,image型別雖然是類庫中的型別,但是writeobject仍然會報錯,因為這個型別沒有被申明。

[csharp]view plain

copy

print?

例如上面這個型別,image型別雖然是類庫中的型別,但是writeobject仍然會報錯,因為這個型別沒有被申明。 

[csharp]view plain

copy

print?

需要使用datacontract、knowntype、datamember來標明。 

[csharp]view plain

copy

print?

需要使用datacontract、knowntype、datamember來標明。 

[csharp]view plain

copy

print?

datamember是必須要的,否則writeobject根本不會序列化,傳過去也是個空的。 

物件陣列。自定義物件

定義學生類屬性 自定義方法 顯示學生資訊方法年齡增加方法測試類 建立用於儲存學生的陣列,長度為5,建立5個學生物件,將物件儲存到陣列中遍歷陣列中的學生物件,分別呼叫年齡增加方法,將學生年齡增加2遍歷陣列中的學生物件,分別呼叫顯示資訊的方法,檢視所有學生資訊查詢年齡大於20的學生資訊 針對這個作業。寫...

建立自定義物件

你並不侷限於前幾節所討論的jscript的內建物件,你可以自定義包含有你自己的方法和屬性的物件來擴充jscript,這是jscript的乙個強大的特性。例如,你可以建立乙個名為webuser的物件,它包含參觀你網點的使用者的資訊,這個物件可以包含諸如使用者名稱 密碼和註冊狀態之類的屬性,將所有這些屬...

JS自定義物件

語法 obj name,age 表示物件obj的屬性名,冒號後面的為屬性值,像這種形式叫鍵值對 skill 是obj物件的方法1.字面量 2.工廠模式 3.建構函式模式 4.原型模式 5.混合模式 原型模式和建構函式模式的混合 var obj console.log obj name 什麼顏色 ob...