.NET 2.x Почему BinaryFormatter не сериализует мой класс? - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Проблема в том, что BinaryFormatter не сериализует этот класс (необходим мне для Unity, так как там проблема с дессереализацией KeyValuePair):
[Serializable]
    public class SerializableDictionary<TKey, TVal>
    {
        [Serializable]
        private class _KeyValuePair<TKey, TVal>
        {
            public TKey Key;
            public TVal Value;
        }
 
        private _KeyValuePair<TKey, TVal>[] serializationData
        {
            get
            {
                int count = dictionary.Count;
                _KeyValuePair<TKey, TVal>[] kv = new _KeyValuePair<TKey, TVal>[count];
                if(count > 0)
                {
                    IEnumerator<KeyValuePair<TKey, TVal>> ie = dictionary.GetEnumerator();
                    int i = 0;
                    while(ie.MoveNext())
                    {
                        _KeyValuePair<TKey, TVal> element = new _KeyValuePair<TKey, TVal>();
                        element.Key = ie.Current.Key;
                        element.Value = ie.Current.Value;
                        kv[i] = element;
                        i++;
                    }
                }
                return kv;
            }
            set
            {
                if(dictionary == null)
                {
                    dictionary = new Dictionary<TKey, TVal>();
                }
                _KeyValuePair<TKey, TVal>[] kv = value;
                if(kv.Length > 0)
                {
                    for(int i = 0; i < kv.Length; i++)
                    {
                        dictionary.Add(kv[i].Key, kv[i].Value);
                    }
                }
            }
        }
 
        [NonSerialized]
        public Dictionary<TKey, TVal> dictionary;
 
        public SerializableDictionary()
        {
            dictionary = new Dictionary<TKey, TVal>();
        }
 
        public TVal this[TKey key]
        {
            get
            {
                return dictionary[key];
            }
            set
            {
                dictionary[key] = value;
            }
        }
 
        public bool ContainsKey(TKey key)
        {
            return dictionary.ContainsKey(key);
        }
 
        public void Add(TKey key, TVal value)
        {
            dictionary.Add(key, value);
        }
 
        public bool TryGetValue(TKey key, out TVal value)
        {
            return dictionary.TryGetValue(key, out value);
        }
 
        public void Remove(TKey key)
        {
            dictionary.Remove(key);
        }
    }
При серриализации даже не обращается к serializationData. .NET 2.0.

Решение задачи: «.NET 2.x Почему BinaryFormatter не сериализует мой класс?»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Text;
 
namespace BuildingLibrary
{
    [Serializable()]
    public class SerializableDictionary<TKey, TVal> : ISerializable
    {
        [Serializable]
        protected class _KeyValuePair<TKey, TVal>
        {
            public TKey Key;
            public TVal Value;
 
            public _KeyValuePair()
            { }
        }
        protected _KeyValuePair<TKey, TVal>[] serializationData
        {
            get
            {
                int count = dictionary.Count;
                _KeyValuePair<TKey, TVal>[] kv = new _KeyValuePair<TKey, TVal>[count];
                if(count > 0)
                {
                    IEnumerator<KeyValuePair<TKey, TVal>> ie = dictionary.GetEnumerator();
                    int i = 0;
                    while(ie.MoveNext())
                    {
                        _KeyValuePair<TKey, TVal> element = new _KeyValuePair<TKey, TVal>();
                        element.Key = ie.Current.Key;
                        element.Value = ie.Current.Value;
                        kv[i] = element;
                        i++;
                    }
                }
                return kv;
            }
            set
            {
                if(dictionary == null)
                {
                    dictionary = new Dictionary<TKey, TVal>();
                }
                _KeyValuePair<TKey, TVal>[] kv = value;
                if(kv.Length > 0)
                {
                    for(int i = 0; i < kv.Length; i++)
                    {
                        dictionary.Add(kv[i].Key, kv[i].Value);
                    }
                }
            }
        }
 
        [NonSerialized]
        public Dictionary<TKey, TVal> dictionary;
 
        public SerializableDictionary()
        {
            dictionary = new Dictionary<TKey, TVal>();
        }
 
        protected SerializableDictionary(SerializationInfo info, StreamingContext context)
        {
            serializationData = (_KeyValuePair<TKey, TVal>[])info.GetValue("serializationData", typeof(_KeyValuePair<TKey, TVal>[]));
        }
 
        public TVal this[TKey key]
        {
            get
            {
                return dictionary[key];
            }
            set
            {
                dictionary[key] = value;
            }
        }
 
        public bool ContainsKey(TKey key)
        {
            return dictionary.ContainsKey(key);
        }
 
        public void Add(TKey key, TVal value)
        {
            dictionary.Add(key, value);
        }
 
        public bool TryGetValue(TKey key, out TVal value)
        {
            return dictionary.TryGetValue(key, out value);
        }
 
        public void Remove(TKey key)
        {
            dictionary.Remove(key);
        }
 
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("serializationData", serializationData, typeof(_KeyValuePair<TKey, TVal>[]));
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы