تمرير جمع العودية من خلال WCF
-
26-09-2019 - |
سؤال
أريد تمرير مجموعة عامة من البيانات من خلال طريقة WCF. البيانات هي في الأساس مجرد مجموعة هرمية من أزواج المفاتيح/القيمة ، لكنها متداخلة إلى مستوى تعسفي. لقد فكرت في الأصل في تمريرها كسلسلة واحدة وأقوم بعمل XML أو JSON أو تشفير/فك تشفير مماثل في أي من الطرفين ، ولكن نظرًا لأن نقل WCF هو XML على أي حال ، بدا الأمر سخيفًا بعض الشيء ، لذلك آمل أن يكون هناك طريقة لتمريرها "بطبيعة الحال".
الطريقة واضحة إلى حد ما:
[OperationContract]
void ProcessData(DataTree tree);
مع:
public class DataTree : Dictionary<string, DataTree>
{
}
كل هذا يتجمع بشكل جيد ، ولكن عندما أحاول تشغيل الخدمة ، فإنها تتعطل مع stackoverflowexception ضمن datacontract.getStablename.
لقد حاولت وضع ملف [CollectionDataContract]
ميزة على DataTree
الفئة وتحديد جميع الأسماء بشكل صريح ، ولكن يبدو أن هذا لا يحدث أي فرق.
لقد حاولت أيضًا وضع ملف [DataContract]
على ذلك ، ولكن بعد ذلك يفشل في وقت مبكر بسبب Dictionary
هو ISerializable
.
أيه أفكار؟ هل هناك طريقة أفضل للقيام بذلك؟
المحلول 2
كما اتضح ، ظهر شرط آخر (تحديد قيمة بسيطة لعقدة بالإضافة إلى قائمة من الأطفال) ، لذلك انتهى بي الأمر إلى تحديد نوع الطفل لذلك على أي حال ، والذي يبدو أنه جعل WCF سعيدًا به:
[CollectionDataContract(IsReference = true, ItemName = "Param",
KeyName = "Name", ValueName = "Data")]
public class DataTree : Dictionary<string, DataTreeEntry>
{
}
[DataContract]
public class DataTreeEntry
{
[DataMember]
public string Value { get; set; }
[DataMember]
public DataTree Children { get; set; }
}
نصائح أخرى
بالنسبة لأشجار الكائنات الكبيرة في الماضي ، قمت بتسلسل البيانات بنفسي إلى صفيف بايت يتم إرسال الطرف المتلقي.
إنشاء أساسا Serialize(BinaryWriter writer)
و DeSerialize(BinaryReader reader)
بالنسبة للصفوف المعنية التي تسلسل نفسها ، وتمرر الكاتب/القارئ وصولاً إلى الأشياء الفرعية للتسلسل المتكرر.
يمكنك أيضا النظر في استخدام protobuf-net للتسلسل/إزالة التسلسل. إما كنقل على مكالمة WCF الخاصة بك ، أو يدويًا ، وتمرير صفيف بايت فوق السلك.