ISerializable для Коллекции <T> - PullRequest
0 голосов
/ 27 ноября 2018

Я пишу код сериализации для класса Collection<T> и хотел бы знать, как устанавливать и получать элементы в коллекции.Я использую двоичную сериализацию.

Я сделал попытку в следующем коде, но не уверен в правильном подходе.

Вот мой код:

[Serializable]
public class EmployeeCollection<Employee> : Collection<Employee>, ISerializable
{
    public int EmpId;
    public string EmpName;
    public EmployeeCollection()
    {
        EmpId = 1;
        EmpName = "EmployeeCollection1";
    }
    public EmployeeCollection(SerializationInfo info, StreamingContext ctxt)
    {
        EmpId = (int)info.GetValue("EmployeeId", typeof(int));
        EmpName = (String)info.GetValue("EmployeeName", typeof(string));
        //Not sure on the correct code for the following lines
        var EmployeeCollection = (List<Employee>)info.GetValue("EmployeeCollection", typeof(List<Employee>));
        for (int i = 0; i < EmployeeCollection.Count; i++)
        {
            this.Add(EmployeeCollection[i]);
        }
    }

    public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
    {
        info.AddValue("EmployeeId", EmpId);
        info.AddValue("EmployeeName", EmpName);
        //Not sure on the correct code for the following lines
        var EmployeeCollection = new List<Employee>();
        for (int i = 0; i < this.Count; i++)
        {
            EmployeeCollection.Add(this[i]);
        }
        info.AddValue("EmployeeCollection", EmployeeCollection);
    }

В методе GetObjectData List<Employee> успешно добавляется к SerializationInfo.Однако в методе EmployeeCollection в List<Employee> есть запись null для каждого добавленного элемента.

Как правильно сериализовать и десериализовать элементы в классе Collection<T> при реализации ISerializable интерфейс?

1 Ответ

0 голосов
/ 29 ноября 2018

Вместо того чтобы тратить время на написание пользовательской сериализации, необходимой для BinaryFormatter, попробуйте AnySerializer .Вам не нужно писать какой-либо код сериализации, а поддержка универсальных коллекций встроена.Вы можете опустить атрибут [Serializable] и избавиться от интерфейса ISerializable.Если это работает для вас, дайте мне знать, как я автор.

Рабочий пример:

public class EmployeeCollection<Employee> : Collection<Employee>
{
    public int EmpId;
    public string EmpName;
    public EmployeeCollection()
    {
        EmpId = 1;
        EmpName = "EmployeeCollection1";
    }
}

// serialize/deserialize
using AnySerializer;

var collection = new EmployeeCollection();
var bytes = Serializer.Serialize(collection);
var restoredCollection = Serializer.Deserialize<EmployeeCollection<Employee>>(bytes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...