سؤال

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

العناصر موجودة في:

public ObservableCollection<Trade> Trades { get; private set; }

على التسلسل يتم ذلك في getObjectData على المعلمة SerializationInfo:

Trade[] trades = (Trade[])Trades.ToArray<Trade>();
            info.AddValue("trades", trades);

وعلى إزالة الاستهلاك يتم ذلك في مُنشئ التسلسل أيضًا على معلمة SerializationInfo:

Trade[] trades = (Trade[])info.GetValue("trades", typeof(Trade[]));

            foreach (Trade t in trades)
            {
                Trades.Add(t);
            }

تعطيني إزالة الاستعانة دائمًا بمجموعة من الفهود ، وكما ذكرت سابقًا ، يقوم عنصر واحد بتسلسله ويغضب على ما يرام مع هذا الرمز:

التسلسل (طريقة getObjectData):

info.AddValue("trade", Trades.First<Trade>());

هروب (مُنشئ التسلسل):

Trade t = (Trade)info.GetValue("trade", typeof(Trade));
            Trades.Add(t);

هل هذه مشكلة شائعة؟ يبدو أنني لا أجد أي شخص آخر يركض فيه على الأقل. نأمل أن يكون هناك حل :) وإذا كنت بحاجة إلى تزويدك بمزيد من المعلومات/الكود فقط أخبرني.

شكرًا!

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

المحلول

صفيف يستحضر أولا. ثم يتم إلغاء التخلص الداخلي. لذلك عندما تحاول الوصول إلى العناصر ، فهي فارغة.

وفكرة الاستخدام [OnDeserialized] تنسب إلى بعض الطرق ، التي تبني جميع المناسبة الأخرى. وهنا مثال:

[Serializable]
public class TestClass : ISerializable
{
    private Trade[] _innerList;
    public ObservableCollection<Trade> List { get; set; }

    public TestClass()
    { }

    [OnDeserialized]
    private void SetValuesOnDeserialized(StreamingContext context)
    {
        this.List = new ObservableCollection<Trade>(_innerList);
        this._innerList = null;
    }

    protected TestClass(SerializationInfo info, StreamingContext context)
    {
        var value = info.GetValue("inner", typeof(Trade[]));
        this._innerList = (Trade[])value;
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("inner", this.List.ToArray());
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top