سؤال

أريد تمرير مجموعة عامة من البيانات من خلال طريقة 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 الخاصة بك ، أو يدويًا ، وتمرير صفيف بايت فوق السلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top