سؤال

ولدي الرسم البياني الكائن كبير جدا بأنني تسلسل إلى ملف عبر DataContractSerializer. أريد الآن أن تقديم قائمة من هذه الملفات للمستخدم لاختيار من بينها. في هذه القائمة، وتريد أن تظهر بعض التفاصيل حول الملف، وهي خصائص الكائن الجذر. أنا لا أريد لتحميل الرسم البياني كله في الذاكرة، منذ أنا مهتم فقط في عرض خصائص عقدة الجذر.

لا أحد يعرف وسيلة للسيطرة على "عمق" لإلغاء التسلسل حتى أستطيع أن مجرد سحب الكائن الجذر من ملف وتخطي الأطفال؟ فما استقاموا لكم فاستقيموا بدلا تجنب معالجة الملف كملف XML الخام، منذ أنا لا أفعل أي تلاعب XML الخام في أي مكان آخر، والتي من شأنها أن تكون واحدة فرع أكثر من التعليمات البرمجية التي لدي للحفاظ على وفاق.

وفكرتي الوحيدة في الوقت الراهن هو خلق متوافق "موجز" الكائن الذي يحتوي فقط على خصائص أنا مهتم، وأيا من الأطفال، وإلغاء تسلسل الملف إلى ذلك. وهذا ينبغي أن تخطي الأطفال لأنها ليست ذات الصلة إلى كائن ملخص.

هل هناك طريقة أفضل لتحقيق ذلك؟

على تحديث / توضيح : في الصفات ليست هي الحل أنا أبحث عن. لشيء واحد، وأنها سوف تمنع خصائص "إضافية" من أن ينتهي به الامر في الملف عندما كان تسلسل الكائن أولا.

وثانيا، أنهم أكثر ديمومة من ما أحاول القيام به. في نهاية المطاف، أنا لا أريد أن إلغاء تسلسل الملف بأكمله، وليس فقط في هذه المرحلة. أحاول أن تظهر قائمة موجزة من الملفات التي يقوم المستخدم اختيار من بينها للاستيراد. أثناء الاستيراد، وانا ذاهب لفي حاجة إلى كل أبناء وأحفاد. انها مجرد مبالغة خلال الخطوة 1. هذه هي الملفات يحتمل أن تكون كبيرة، لذلك تماما deserializing العديد منهم فقط حتى أتمكن من عرض معلومات رأس بهم لن ينجح.

ونأمل أن يزيل أي لبس حول السؤال الأصلي.

هل كانت مفيدة؟

المحلول

وهذا الى حد كبير الطريقة التي تريد أن تفعل ذلك. ويهدف DataContractSerializer للتعامل مع هذا الوضع، حيث لديك لأنواع التي هي المفهوم نفسه، ولكن أنواع مختلفة من وجهة نظر CLR وجهة نظر الذي تريد تسلسل في بعضها البعض.

وبالنظر إلى ذلك، مجرد إنشاء كائن مع مجموعة فرعية مماثلة من الخصائص التي تريد إجراء تسلسل وتمرير هذا النوع إلى DataContractSerializer.

تأكد من أن على "ملخص" نوع من تعيين خصائص السمة DataContract (وكذلك سمات أي DataMember أو سمات DataContract على الأطفال التي كشف)، وتحديدا في اسم والنطاق خصائص لتعكس اسم ومساحة لل نوع غير ملخص (لأن هذه يجب أن تتطابق).

نصائح أخرى

وتوصيتي الأولى ستكون للقيام التلاعب XML إذا كنت ترغب فقط في سحب بعض التفاصيل من عقدة الجذر. وهناك احتمال آخر، على الرغم من أنني لا أعرف الآثار الفهرسه، هو استخدام قدرات الإصدارات من DataContractSerializer لهذه المشكلة. على عقد البيانات الخاصة بك، وعلامة كل مجال باستثناء تلك التي سوف تحتاج في الملخص كما الاختياري. ثم نسخ العقد البيانات وفئة أخرى، تاركة الحقول الاختيارية. إلغاء تسلسل إلى عقد بيانات جديدة، أصغر.

class Program
{
    static void Main(string[] args)
    {
        Person a = new Person();
        Person b = new Person();
        a.Name = "Mike";
        b.Name = "Joe";
        b.Parent = a;

        DataContractSerializer dtc = new DataContractSerializer(typeof(Person));

        StringBuilder sb = new StringBuilder();
        using (XmlWriter xr = XmlWriter.Create(sb))
        {
            dtc.WriteObject(xr, b);
        }

        object n;

        DataContractSerializer dtc2 = new DataContractSerializer(typeof(TinyPerson));

        using (XmlReader xr = XmlReader.Create(new StringReader(sb.ToString())))
        {
            n = dtc2.ReadObject(xr);
        }

    }
}

[DataContract(Name="Person")]
public class Person
{
    [DataMember]
    public string Name;

    [DataMember(IsRequired=false)]
    public Person Parent; 
}


[DataContract(Name = "Person")]
public class TinyPerson
{
    [DataMember]
    public string Name;

}

ويمكنك التحكم التسلسل باستخدام الصفات. قراءة المزيد هنا

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