Как я могу сериализовать базовый класс при работе с экземпляром производного класса? - PullRequest
2 голосов
/ 30 января 2011

Имеют следующую структуру

[Serializable]
public class Parent
{
    public int x = 5;
}

[Serializable]
public class Child : Parent
{
    public HashAlgorithm ha; //This is not Serializable

}

Я хочу сериализовать это, используя следующий код:

public class Util {
    static public byte[] ObjectToByteArray(Object obj)
    {
        if (obj == null)
        {
            return null;
        }
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream();
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

Я работаю с объектами типа Child в моем коде, однакоУ меня есть поле внутри объекта Child, которое не сериализуемо (например, HashAlgorithm).Следовательно, я попытался преобразовать в тип Parent, используя следующий код:

public byte[] tryToSerialize(Child c)
{
    Parent p = (Parent) c;
    byte[] b = Util.ObjectToByteArray(p);
    return b;
}

Однако это возвращает ошибку, что HashAlgorithm не сериализуется, несмотря на попытку сериализовать дочерний элемент, который не включает этополе.Как я могу выполнить то, что мне нужно?

Ответы [ 2 ]

4 голосов
/ 30 января 2011

Это невозможно.
Вы не можете сериализовать класс как один из его базовых классов.

Вместо этого добавьте [NonSerialized] в поле.

3 голосов
/ 10 апреля 2014

Вы можете реализовать ISerializable в базовом классе, а затем просто передавать вещи из производных, как:

private Child() { } // Make sure you got a public/protected one in Parent

private Child(SerializationInfo info, StreamingContext context) 
     : base(info, context) { }

После реализации ISerializable просто используйте метод Serialize от Child.

...