يؤدي إلغاء تسلسل القائمة العامة إلى إرجاع قيمة فارغة

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

سؤال

أقوم بإلغاء/تسلسل كائن مثل ذلك:

public class myClass : ISerializable
{
  public List<OType> value;

  public myClass(SerializationInfo info, StreamingContext context)
  {
    this.value = (List<OType>)info.GetValue("value", typeof(List<OType>));
  }

  void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("value", value, typeof(List<OType>));
  }
}

الكائن الموجود في القائمة يفعل لديك السمة القابلة للتسلسل.عند إجراء التسلسل، لا يتم طرح أي أخطاء وتكون القائمة أبداً فارغة، ولكن عند إلغاء التسلسل تكون جميع قوائمي فارغة ولست متأكدًا من السبب.

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

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

المحلول

وكذلك قائمة دائما فارغة لتبدأ، وأنت تحديد ذلك عن طريق myClass.value = new List<...>();؟ أيضا قمت بحفظ البيانات المتسلسلة في كل من الأشكال الثنائية و XML حتى تتمكن من التحقق من البيانات هو في الواقع يتم حفظها؟

ومجرد ملاحظة أيضا، إذا كنت تستخدم 2.0+ لم يكن لديك لتنفيذ ISerializable إذا كنت لا تحتاج إلى السيطرة على التسلسل المطلق، يمكنك تغيير القيمة إلى الممتلكات العامة، وسوف تسلسل على نفسه .

وتحرير: القضية التالية ويبدو أن تسلسل وإلغاء تسلسل غرامة بالنسبة لي، وأنا على نشر هذه طارئ أنا سوء فهم السؤال ككل

وتجاهل رمز اختبار سيئة، ونأمل أن يساعد هذا قليلا.

    [Serializable]
    public class OType
    {
        public int SomeIdentifier { get; set; }
        public string SomeData { get; set; }

        public override string ToString()
        {
            return string.Format("{0}: {1}", SomeIdentifier, SomeData);
        }
    }

    [Serializable]
    public class MyClass : ISerializable
    {
        public List<OType> Value;

        public MyClass() {  }

        public MyClass(SerializationInfo info, StreamingContext context)
        {
            this.Value = (List<OType>)info.GetValue("value", typeof(List<OType>));
        }

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("value", Value, typeof(List<OType>));
        }
    }

...

        var x = new MyClass();

        x.Value = new OType[] { new OType { SomeIdentifier = 1, SomeData = "Hello" }, new OType { SomeIdentifier = 2, SomeData = "World" } }.ToList();

        var xSerialized = serialize(x);

        Console.WriteLine("Serialized object is {0}bytes", xSerialized.Length);

        var xDeserialized = deserialize<MyClass>(xSerialized);

        Console.WriteLine("{0} {1}", xDeserialized.Value[0], xDeserialized.Value[1]);

ونسيت إخراج ..

<اقتباس فقرة>   

وجوه تسلسل هو 754bytes

     

1: مرحبا 2: العالم

نصائح أخرى

عندما تقول أن قائمتك فارغة، هل تعني أن القائمة نفسها فارغة أم أنها مليئة بإدخالات فارغة؟إذا كان الأخير، فهذه مشكلة .Net معروفة:يرى سؤالي على نفس المشكلة.

أساسًا، List<T>تتم تهيئة s فقط عندما يتم إلغاء تسلسلها؛يتم إلغاء تسلسل الكائنات التي تحتوي عليها فقط بعد إلغاء تسلسل الرسم البياني للكائن.إحدى الطرق للتغلب على ذلك هي وضع أي رمز يتطلب ذلك في ملف OnDeserialized طريقة، أو واحدة مع [OnDeserializedAttribute].يرى MSDN.

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