Pergunta

Estou DE / serialização de um objeto assim:

public class myClass : ISerializable
{
  public List<OType> value;

  public myClass(SerializationInfo info, StreamingContext context)
  {
    this.value = (List<OType>)info.GetValue("value", typeof(List<OType>));
  }

  void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("value", value, typeof(List<OType>));
  }
}

O objeto que está na lista faz ter o atributo Serializable. Quando a serialização, sem erros são jogados ea lista é não esvaziar, mas quando deserializing todas as minhas listas são nulos e eu não sei por que.

Estou marcando este como respondidas por CQ. I foi capaz de produzir um pequeno off aplicativo de teste que faz corretamente serialize / deserialize com os objetos que eu estou tentando usar, mas eu ainda não consigo fazê-lo funcionar no meu código de produção, mas eu suspeito que é uma coisa pequena que eu 'm faltando.

Foi útil?

Solução

Bem, a lista está sempre vazio, para começar, você está definindo-o via myClass.value = new List<...>();? Também tem você salvou os dados serializados em ambos os formatos binários e XML para que possa verificar os dados que realmente está sendo salvo?

Apenas uma nota, bem como, se você estiver usando 2.0+ você não tem que implementar ISerializable se você não precisa controlar a serialização absoluta, você pode alterar o valor de uma propriedade pública e que irá seriar, por si própria .

Edit:. O caso a seguir parece serialize e deserialize bem para mim, eu estou postando isso meter eu sou mal-entendido a questão como um todo

Ignorando o código de teste desagradável, espero que isso ajude um pouco.

    [Serializable]
    public class OType
    {
        public int SomeIdentifier { get; set; }
        public string SomeData { get; set; }

        public override string ToString()
        {
            return string.Format("{0}: {1}", SomeIdentifier, SomeData);
        }
    }

    [Serializable]
    public class MyClass : ISerializable
    {
        public List<OType> Value;

        public MyClass() {  }

        public MyClass(SerializationInfo info, StreamingContext context)
        {
            this.Value = (List<OType>)info.GetValue("value", typeof(List<OType>));
        }

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("value", Value, typeof(List<OType>));
        }
    }

...

        var x = new MyClass();

        x.Value = new OType[] { new OType { SomeIdentifier = 1, SomeData = "Hello" }, new OType { SomeIdentifier = 2, SomeData = "World" } }.ToList();

        var xSerialized = serialize(x);

        Console.WriteLine("Serialized object is {0}bytes", xSerialized.Length);

        var xDeserialized = deserialize<MyClass>(xSerialized);

        Console.WriteLine("{0} {1}", xDeserialized.Value[0], xDeserialized.Value[1]);

Esqueceu a saída ..

objeto serializado é 754bytes

1: Olá 2: World

Outras dicas

Quando você diz que a sua lista é nulo, você quer dizer que a lista em si é nulo, ou que preenchidos com entradas nulas? Neste último caso, então este é um problema .Net conhecido: veja minha pergunta no mesmo problema.

Basicamente, List<T>s só são inicializados quando são desserializado; os objectos que eles contêm apenas são desserializadas após o gráfico do objeto foi desserializadas. Uma maneira de contornar isso é colocar qualquer código que lhes exige em um método OnDeserialized, ou um com um [OnDeserializedAttribute]. Consulte MSDN .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top