سؤال

ولقد كان لديها بعض المشاكل تسلسل الكائنات الخاصة بي وقد ضاقت المشكلة وصولا الى حالة معينة (انظر التعليمات البرمجية أدناه). الأول هو الحصول على الخطأ التالي:

والخطأ 1 ملف غير صالح RESX. تعذر تحميل نوع Serialisation.Harness.Blob، التسلسل، الإصدار = 1.0.0.0، الثقافة = محايدة الأمر PublicKeyToken = فارغة الذي يستخدم في ملف .RESX. تأكد من أن المراجع اللازمة وأضيفت إلى المشروع. خط 129، موقف 5. ...

والآن هو أن إعادة تشغيل البصرية ستوديو يتسبب في حدوث الخطأ للذهاب بعيدا ورمز للعمل ولكن بعد ذلك بعد عدد تبدو عشوائية من يبني (خلالها رمز قال هو <م> لا تغير) الشيء الغريب حقا وسوف كسر مرة أخرى.

هل ترى ما أفعله خطأ / عداد المفقودين؟

وشكرا جزيلا مقدما،

وميتو

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design; using System.ComponentModel.Design;

namespace Serialisation.Harness
{    

    [Serializable]
    public class Blob
    {
        public Blob()
        {
        }
    }

    [Serializable]
    public class Basic
    {

        private List<Blob> blobs;
        public List<Blob> Blobs
        {
            get { return blobs; }
            set { this.blobs= value; }
        }

        public Basic()
        {
            basics = new List<Blob>();
        }

    }

    public class BasicComponent : Component
    {

        private Basic basic = new Basic();

        private IContainer components = new Container();

        public List<Blob> Blobs
        {
            get { return basic.Blobs; }
            set { basic.Blobs= value; }
        }

        public BasicComponent(IContainer container)
        {
            container.Add(this);
        }

    }

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

المحلول

وأولا وقبل كل شيء، و Serializable لا يتم استخدام السمة لمصمم التسلسل. عندما تسلسل الأشياء، فإن مصمم تسلسل إلى ملف المورد عندما لا تعرف كيف تكتب إلى رمز المصمم. هذا يكتب بها إلى RESX كما فقاعة باستخدام <لأ href = "http://msdn.microsoft.com/en-us/library/system.componentmodel.design.serialization.instancedescriptor.aspx" يختلط = "noreferrer" > InstanceDescriptor للحصول على منشئ افتراضي نوع الكائن (وهذا يفقد أي قيمة العقارات قد ترغب أيضا لتشمل). هذا هو ما يحدث للممتلكات Blobs كمصمم لا تسلسل القوائم العامة لطيف (أنها لا تعرف كيفية تسلسل صفائف على الرغم من).

في أجل الاحتفاظ بالمعلومات داخل هذه استمرت الأشياء، وسوف تحتاج إلى إنشاء <لأ href = "http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx" يختلط = "noreferrer"> TypeConverter يحدد منشئ مختلفة في في InstanceDescriptor (واحد أن يأخذ في الواقع بعض الدول لوصف الخصائص، مثل خاصية Blobs الخاص بك). على سبيل المثال، إذا قمت بإضافة منشئ لنوع BasicComponent الخاص أن يأخذ IEnumerable<Blob>، هل يمكن بعد ذلك الحصول على <لأ href = "http://msdn.microsoft.com/en-us/library/system.componentmodel.design.serialization .instancedescriptor.aspx "يختلط =" noreferrer "> InstanceDescriptor لأن منشئ، ويمر في مجموعة من Blobs (كنت إنشاء List<Blob> جديدة حول ذلك في منشئ). لأن مصمم يعرف كيف تستمر على InstanceDescriptor إلى رمز، ولأنه يعرف كيف تستمر صفائف إلى رمز، فإنه ثم إضافة هذا إلى رمز مصمم الخاص بك بدلا من RESX.

ويمكنك أيضا تنفيذ CodeDomSerializer لتحديد التعليمات البرمجية التي يتم استخدامها لوصف سبيل المثال، والتي يمكن استخدامها للمصمم لحفظ الكائن إلى رمز مصمم بدلا من RESX.

اكتب محول

لاستخدام نهج نوع المحول، قد تفعل شيئا مثل هذا:

public class BasicComponentTypeConverter : TypeConverter
{
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        bool canConvert = base.CanConvertTo(context, destinationType);

        if (!canConvert &&
            (destinationType == typeof(InstanceDescriptor))
        {
            canConvert = true;
        }

        return canConvert;
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        object conversion = null;

        if (culture == null)
        {
            culture = CultureInfo.CurrentCulture;
        }

        BasicComponent component = value as BasicComponent;
        if (basicComponent != null)
        {
            if (destinationType == typeof(InstanceDescriptor))
            {
               // Note that we convert the blobs to an array as this makes for nicer persisted code output.
               // Without it, we might just get a resource blob which is not human-readable.
               conversion = new InstanceDescriptor(
                   typeof(BasicComponent).GetConstructor(new Type[] { typeof(IEnumerable<Blob>) }),
                   new object[] { basicComponent.Blobs.ToArray() },
                   true);
            }
        }

        if (conversion == null)
        {
            conversion = base.ConvertTo(context, culture, value, destinationType);
        }

        return conversion;
    }
}

وتجدر الإشارة إلى أنك قد تحتاج لكتابة تحويل نوع لنوع Blob كذلك. لإرفاق تحويل نوع إلى نوع، فقط بإعلان TypeConverter السمة على الطبقة تحويل نوع سيتم تحويل أي BasicConverter للمثال أعلاه.

scroll top