十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
基礎(chǔ)連接已經(jīng)關(guān)閉 連接被意外關(guān)閉
超過(guò)10多年行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營(yíng)模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:網(wǎng)站設(shè)計(jì)、做網(wǎng)站,成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,小程序定制開(kāi)發(fā),微信開(kāi)發(fā),重慶App定制開(kāi)發(fā),同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營(yíng)銷和我們一樣獲得訂單和生意!
又被我碰到。
有這樣一個(gè)場(chǎng)景,數(shù)據(jù)庫(kù)的表中有一個(gè)字段表示的是產(chǎn)品,但是這個(gè)產(chǎn)品的類型是不同的,也就是說(shuō)屬性不同。為了方便管理因此都使用在該字段中了,使用clob類型,保存一段對(duì)應(yīng)產(chǎn)品類的json的字符串。json的用法可能大家都比較熟悉。
于是我在服務(wù)端打算寫(xiě)這樣幾個(gè)方法。
產(chǎn)品類的模型:
該類表示這個(gè)通用字段,
[DataContract] public class AbstractModel { private string id; [DataMember] public string ID { get { return id; } set { id = value; } } }
這個(gè)類表示產(chǎn)品1的結(jié)構(gòu),
[DataContract] public class ChildModel1:AbstractModel { private string child1ID; private string child1ProductName; [DataMember] public string Child1ID { get { return child1ID; } set { child1ID = value; } } [DataMember] public string Child1ProductName { get { return child1ProductName; } set { child1ProductName = value; } } }
這個(gè)類表示產(chǎn)品2的結(jié)構(gòu),
[DataContract]
public class ChildModel2
{
private string child2ID;
private string child2ProductName;
[DataMember]
public string Child2ID
{
get { return child2ID; }
set { child2ID = value; }
}
[DataMember]
public string Child2ProductName
{
get { return child2ProductName; }
set { child2ProductName = value; }
}
}
服務(wù)方法如下,
契約接口,
[ServiceContract] public interface IService1 { //該方法是為了客戶端能訪問(wèn)到ChildModel1的結(jié)構(gòu) [OperationContract] ChildModel1 DoGetChild1Model(); [OperationContract] ChildModel2 DoGetChild2Model(); //該方法是為了讓AbstractModel可以表示不同的產(chǎn)品模型 [OperationContract] AbstractModel DoGetProduct(); }
實(shí)現(xiàn),
public class Service1 : IService1 { public ChildModel1 DoGetChild1Model() { ChildModel1 child1 = new ChildModel1(); child1.Child1ID = "child1"; child1.Child1ProductName = "產(chǎn)品1"; return child1; } public ChildModel2 DoGetChild2Model() { ChildModel2 child2 = new ChildModel2(); child2.Child2ID = "child2"; child2.Child2ProductName = "產(chǎn)品2"; return child2; } public AbstractModel DoGetProduct() { ChildModel1 child1 = new ChildModel1(); child1.Child1ID = "child1"; child1.Child1ProductName = "產(chǎn)品1"; AbstractModel abmodel = child1; return abmodel; } }
創(chuàng)建wcf應(yīng)用程序運(yùn)行,顯示W(wǎng)CF調(diào)試工具界面
我們先分別運(yùn)行獲取產(chǎn)品1和產(chǎn)品2的方法
都正確。
運(yùn)行通過(guò)父類指向的獲取產(chǎn)品1的方法,
報(bào)錯(cuò)
所以這種用法是行不通的,如果想要獲取兩個(gè)不同的產(chǎn)品,則需要定義兩個(gè)對(duì)應(yīng)的產(chǎn)品字段,分別賦值了。
我的理解依然是序列化時(shí)出錯(cuò)了,序列化時(shí)應(yīng)該是序列化了子類,但是恢復(fù)時(shí)是按照父類的結(jié)構(gòu)恢復(fù)的所以出現(xiàn)異常,反序列化失敗,造成了連接斷開(kāi)。
測(cè)試代碼下載