تخلص من الصفيف دائمًا يعطي مجموعة من الفهود
-
30-09-2019 - |
سؤال
لدي فئة قاعدة مجردة مخصصة مع فصول فرعية صنعتها قابلة للتسلسل/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());
}
}