反序列化对象时,不反序列化值

时间:2014-01-15 16:02:51

标签: c# deserialization binaryformatter

这是我的班级:

namespace myclass
{
    [Serializable]
    public class BasicGameObject : GameObject
    {
      protected Shadow shadow_ = null;
      protected bool shadow_enabled_ = false;

      protected Dictionary<string, AnimationManager> animations_ = new Dictionary<string, AnimationManager>();
      protected Dictionary<string, string> loaded_textures_ = new Dictionary<string, string>();

      protected string current_animation_;

      protected int frame_width_;
      protected int frame_height_;

//Costructor and other methods
//...

    [OnDeserialized]
    private void OnDeserialized(StreamingContext context)
    {
        Console.WriteLine("BasicGameObject");
        foreach (KeyValuePair<string, AnimationManager> anim in animations_)
        {
            animations_[anim.Key].Reload(Loader.GameObjectTexturesList[loaded_textures_[anim.Key]]);
        }
    }

当我反序列化这个对象时,我需要它来重新加载存储在“animations_”中的每个纹理。 如果我在Console.WriteLine("BasicGameObject");上放置一个断点,然后点击anim,调试器会告诉我动画的Count为0,但每个其他变量都有正确的值。 (我确信在保存时,它不是0)

有什么问题?

我如何加载对象(SERIALIZATIONOBJECT_只包含BasicGameObject列表):

    IFormatter formatter = new BinaryFormatter();
    SERIALIZATIONOBJECT_ = (SerializationObject)formatter.Deserialize(stream);
    stream.Close();

在此之后,(以及OnDeserialized调用之后!),如果我做了一些测试,我会看到我的对象的anim具有正确的值。为什么在这里而不是在“OnDeserialized”中?

我只想注意,在我使用相同的相同的函数之前,现在在OnDeserialized没有属性,但只是作为一个函数,我在反序列化后调用它。我看到了自动化的可能性,我觉得它很好。也许它隐藏了一些东西。

2 个答案:

答案 0 :(得分:2)

XmlSerializer仅序列化和反序列化公共字段和属性。

请参阅MSDN documentation

  

XML序列化是转换对象公共的过程   属性和字段为串行格式(在本例中为XML)   储存或运输。 [...]

在这种情况下,您可能希望使用数据传输对象(DTO)。 DTO是一个内部类,它将游戏对象的所有数据保存为可以序列化和反序列化的公共字段或属性。 然后简单地将DTO聚合到您的游戏对象并通过DTO访问数据。

答案 1 :(得分:2)

根据OnDeserialized属性的MSDN documentation

  

应用于方法时,指定调用该方法   在对象图中的对象反序列化之后立即执行。该   反序列化相对于图中其他对象的顺序是   非确定性。

在反序列化对象后调用OnDeserialize方法,但(据我所知)不一定在所有聚合对象也被反序列化后

您正在OnDeserialized方法中执行操作,该方法使用包含animations_对象的聚合AnimationManager字典,该字典也必须反序列化。如果OnDeserialized在之前被称为,则AnimationManager对象被反序列化,它将解释您描述的症状。

最好自己调用该方法并删除OnDeserialized属性。