WCF ผ่านคอลเลกชันหลายประเภท

หากมีปัญหาในการส่งคอลเลกชันประเภทนี้ใน WCF หรือไม่

class Parent
{
  [DataMember]
  // some data members

  [DataMember]
  Child myChild;    
}

class Child : Parent
{
  [DataMember]     
  // some more data members

  [DataMember]
  Parent myParent;
}

ควรมีปัญหาในการส่งรายการ Parent หรือไม่

ฉันได้รับผลลัพธ์แปลกๆ บางครั้งช่องสัญญาณมีข้อผิดพลาด บางครั้งก็ไม่ได้ผิดแต่ไม่ได้ให้ข้อมูลใด ๆ เลยจนกว่าฉันจะลบรายการย่อยทั้งหมดออกจากรายการ


wcf
person Dani    schedule 04.10.2009    source แหล่งที่มา
comment
อัปเดตคำตอบของฉันด้วย CollectionDataContract - ลองดูสิ   -  person marc_s    schedule 04.10.2009


คำตอบ (2)


ก่อนอื่น คุณต้องใส่ [DataContract] ในทุกคลาสที่คุณต้องการให้ซีเรียลไลซ์และดีซีเรียลไลซ์โดย WCF - มันไม่สืบทอดโดยอัตโนมัติ!

[DataContract]
class Parent
{
   .....
}

[DataContract]
class Child : Parent
{
   .....
}

หากคุณกำลังจัดการกับคอลเลกชันสิ่งต่าง ๆ คุณอาจต้องตรวจสอบใน CollectionDataContract :

[CollectionDataContract]
[KnownType(typeof(Parent))]
[KnownType(typeof(Child))]
public class CustomCollection : List<Parent>
{
}

นอกจากนี้ WCF และ SOA โดยทั่วไปยังค่อนข้างแตกต่างจาก OOP เล็กน้อย และจัดการการสืบทอดได้ไม่ดีนัก คุณมักจะต้องใส่แอตทริบิวต์ [ServiceKnownTypes] หรือ [KnownType] ในสัญญาบริการของคุณในตำแหน่งที่คุณต้องการใช้และสนับสนุนความหลากหลาย

ดังนั้น หากคุณมีวิธีการบริการที่ยอมรับ Parent แต่ควรจะสามารถยอมรับอินสแตนซ์ Child ได้เช่นกัน คุณจะต้องตกแต่งวิธีการดังกล่าวด้วยแอตทริบิวต์ [KnownType] เพื่อให้ข้อมูลนี้พร้อมใช้งานสำหรับ WCF

ดูเอกสารประกอบ MSDN ในแอตทริบิวต์ KnownType หรือลองดูคุณสมบัติอื่นๆ นี้ คำถามดังนั้นในหัวข้อ

มาร์ก

person marc_s    schedule 04.10.2009
comment
ดูเหมือนว่าคุณจะพูดถูก.. แต่ถึงแม้ฉันจะเพิ่มคุณสมบัติที่ถูกต้องทั้งหมดแล้ว แต่ฉันก็ยังพบพฤติกรรมแปลกๆ อยู่บ้าง ฉันคิดว่ามันเกี่ยวข้องกับใบหน้าที่วัตถุกำลังถูกสร้างขึ้นโดย NHibernate และบางทีปัญหาอาจอยู่ที่นั่นที่ไหนสักแห่ง... - person Dani; 04.10.2009
comment
ตอนนี้คุณพูดถึง Dani ว่าคุณใช้ NHibernate เท่าที่ฉันจำได้ว่ามันใช้คลาสที่มีตัวเซ็ตที่ได้รับการป้องกันใช่ไหม? ในขณะที่ WCF ต้องการให้คุณสมบัติทั้งหมดที่ทำเครื่องหมายด้วยแอตทริบิวต์ DataContract มี getter และ setter สาธารณะ - person Boris Modylevsky; 04.10.2009
comment
สวัสดี WCF ใช้ได้กับคุณสมบัติของ NH ในขณะที่ยังคงตรวจสอบอยู่ ฉันพบปัญหาคือฉันใช้ประเภทเกณฑ์ของ (พ่อ) เพื่อรับวัตถุ และ NH ก็ส่งคืนพ่อและลูกชายทั้งหมด (ตามที่คาดไว้...) และ WCF ไม่สามารถจัดการได้ - b/c คาดว่าจะมีเพียงออบเจ็กต์ประเภทพาเรนต์ (แม้ว่าจะมีวัตถุลูกอยู่ข้างในก็ไม่ใช่ปัญหา - การที่ทั้งพาเรนต์และลูกในอาเรย์ส่งคืนทำให้ช่องมีข้อบกพร่อง ตอนนี้ฉันกำลังตรวจสอบว่าฉัน ฉันสามารถเปลี่ยนแบบสอบถามเพื่อรับเฉพาะวัตถุของพ่อได้และหวังว่ามันควรจะแก้ไขปัญหาได้ - person Dani; 05.10.2009
comment
มาร์ค ดูเหมือนว่าปัญหาอื่นอาจกำลังปกปิดปัญหานี้อยู่ มีปัญหาการอ้างอิงแบบวงกลมที่นี่ ผู้ปกครองชี้ให้เด็กชี้ไปที่ผู้ปกครอง NH โอเคกับเรื่องนี้ แต่ WCF ไม่เป็นเช่นนั้น ฉันมีคำถามอีกข้อเกี่ยวกับเรื่องนี้ที่นี่ และฉันยังคงตรวจสอบวิธีแก้ปัญหามากมายสำหรับปัญหานี้ เมื่อการอ้างอิงแบบวงกลมได้รับการแก้ไขแล้ว ฉันสามารถกลับไปที่ปัญหาการสืบทอดได้... - person Dani; 14.10.2009
comment
แก้ไขปัญหาการอ้างอิงแบบวงกลมแล้ว ฉันจะเพิ่มปัญหาการสืบทอดกลับเข้าไป และทำการทดสอบกับโซลูชันของคุณเพื่อดูว่าใช้งานได้หรือไม่ - person Dani; 27.10.2009

ฉันอยากจะแนะนำให้เพิ่ม IsReference และ KnownType ให้กับคลาสของคุณ ดังที่แสดงด้านล่าง:

[DataContract(IsReference = true)]
[KnownType(typeof(Child))]
class Parent
{
  [DataMember]
  some data members

  [DataMember]
  Child myChild;
}

[DataContract(IsReference = true)]
class Child : Parent
{
  [DataMember]
  some more data members

  [DataMember]
  Parent myParent;
}
person Boris Modylevsky    schedule 04.10.2009
comment
ลองแล้วยังฆ่าการสืบทอด แต่ก็ยังใช้งานไม่ได้ (ตอนนี้พ่อมีเพียง IList ของมันเท่านั้น แต่วัตถุลูกไม่สืบทอดพ่อ (ทั้งคู่สืบทอดคลาสพื้นฐานบางส่วน) - person Dani; 04.10.2009
comment
สำหรับการรวบรวมออบเจ็กต์ทั่วไปที่ทำงานผ่าน WCF โปรดอ่านที่นี่: borismod blogspot.com/2009/06/ - person Boris Modylevsky; 04.10.2009