إيسيرياليزابل:تعيين كائن موجود عند إلغاء التسلسل

StackOverflow https://stackoverflow.com/questions/3213410

  •  13-09-2020
  •  | 
  •  

سؤال

مهمتنا بسيطة للغاية ، لدينا رسم بياني للكائن حيث يكون لكل كائن (معرف) معرف فريد.يوجد الرسم البياني للكائن مرتين ، على العميل وعلى جهاز الخادم.

الآن نقوم بتمرير بعض الأوامر القابلة للتسلسل إلى الخادم.يحتوي الأمر على حقول بعض المعرفات.إيديتمز تنفيذ واجهة إيسيرياليزابل وتخزين فقط معرفهم في سيرياليزاتيونينفو.مثل:

// The method called when serializing a IDItem.
void GetObjectData(SerializationInfo info, StreamingContext context)
{
    // Instead of serializing this object, just save the ID
    info.AddValue("ID", this.GetID());
}

المشكلة هي, كيف يمكننا تعيين الكائن الموجود إلى المثيل الذي يخلق ديسيرياليزر?من الواضح أن شيئا مثل ما يلي في منشئ إيسيرياليزابل لا يعمل ، لأن ' هذا ' معرف للقراءة فقط:

//does not work   
protected IDItem(SerializationInfo info, StreamingContext context)
{
    this = GlobalObject.GetIDItem(info.GetString("ID"));
}

لذلك أي فكرة كيف يمكننا تعيين كائن موجود إلى كائن ديسيرياليزد?

مع أطيب التحيات, تالم

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

المحلول

أنت قد تكون قادرة على القيام بذلك عن طريق إنشاء كائن وكيل التي تنفذ IObjectReference ويؤدي إلغاء التسلسل المزيف.

(كائن الوكيل الخاص بك سوف تحتاج إلى الوجود على كل من العميل والخادم ، وأعتقد أن نوع الإصدار الخاص بك الخ سوف تحتاج أيضا إلى أن تكون بالضبط نفس على حد سواء.)

[Serializable]
public class Example : ISerializable
{
    // ...

    void ISerializable.GetObjectData(
        SerializationInfo info, StreamingContext context)
    {
        info.SetType(typeof(ExampleDeserializationProxy));
        info.AddValue("ID", this.GetID());
    }
}

// ...

[Serializable]
public class ExampleDeserializationProxy : IObjectReference, ISerializable
{
    private readonly int _id;

    private ExampleDeserializationProxy(
        SerializationInfo info, StreamingContext context)
    {
        _id = info.GetInt32("ID");
    }

    object IObjectReference.GetRealObject(StreamingContext context)
    {
        return GlobalObject.GetIDItem(_id);
    }

    void ISerializable.GetObjectData(
        SerializationInfo info, StreamingContext context)
    {
        throw new NotSupportedException("Don't serialize me!");
    }
}

نصائح أخرى

لا يمكنك القيام بذلك مباشرة هكذا.

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

إذا كان المعرف فريدا وتخزينه في مجموعة في مكان ما مع الكائن، فإن وجود معرف مرت كسلسلة، أو أيا كان نوع البيانات، يجب أن يكون كافيا لإجراء بحث في مجموعتك الحالية من الكائنات.

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