反序列化Revit API



这是我第一次接触序列化…事实上,我正在用c#开发Autodesk Revit。

目的:

我需要将数据记录到HDD上的新文件中,以便通过Revit从另一台计算机打开该文件。

程序:

  1. 从Main类处理所有需要的数据。
  2. 实例化这些数据并将其传递给Serializable类。
  3. 保存主类的数据文件
  4. 处理流并设置可序列化类为空。
  5. 反序列化。
  6. 根据获取的数据在revit上进行操作。

-程序工作完美,没有错误,一切都很好。-再次按下按钮重新运行程序,反序列化失败,错误码

Cons_Coor。ThrDviewData不能强制转换为[B] con_coor .ThrDviewData。类型A源自于位置"C:UsersmostafaAppDataLocalTempRevitAddins con_coor - executor -20140820_224454_4113 con_coor .dll"的上下文"LoadNeither"中的"con_coor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"。类型B来自于位置"C:UsersmostafaAppDataLocalTempRevitAddins con_coor - executing -20140820_230011_0316 con_coor .dll"的上下文"LoadNeither"中的"con_coor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"。类型为"System"的第一次机会异常。NullReferenceException'在con_coor .dll中发生

主类:

///main class
.....
.....
ThrDviewData v3ddata = new ThrDviewData(); ///instantiate a serializable class
///collect all required data
string filename = UT_helper.conpaths(UT_constants.paths.Desktop) + "\comment2" +      DateTime.Today.ToShortTimeString().Replace(":", "") + ".a4h";
        using (Stream stream = File.Open(filename, FileMode.Create))
        {
            BinaryFormatter bformatter = new BinaryFormatter();
            Debug.WriteLine("Writting Datarn");
            bformatter.Serialize(stream, v3ddata);
            stream.Close();
        }
        v3ddata = null;
        using (Stream stream = File.Open(filename, FileMode.Open))
        {
            BinaryFormatter bformatter = new BinaryFormatter();
            Debug.WriteLine("Reading data from file");
            try
            {
                v3ddata = (ThrDviewData)bformatter.Deserialize(stream);
            }
            catch (Exception ex)
            {
                Debug.Write(ex.Message);
                //  File.Delete(filename);
            }
            stream.Close();
        }
....
....
///do some stuff with the acquired data
可序列化类

  public string myvariables;

    public ThrDviewData()
    {
        myvariables = null;

    }

    public ThrDviewData(SerializationInfo info, StreamingContext ctxt)
    {
            myvariables= (String)info.GetValue("name", typeof(string));
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("name", myvariables);
}

    // Public implementation of Dispose pattern callable by consumers. 
    public void Dispose()
    {            
        GC.SuppressFinalize(this);
    }

}

有什么提示吗?

您正在使用的Binary Serializer与您要导出的类紧密相连。当您使用Revit Addin管理器加载插件时,它会动态复制您的程序集(以便您可以在同一会话中返回并再次加载它)。当它这样做时,您将得到具有相同名称的重复类型(ThrDviewData)。当您尝试加载来自不同副本的先前序列化的二进制文件时,它仍在尝试映射到原始类型(而不是该类型的新副本)。

你的选择是:1. 不要使用插件管理器,只是静态地使用插件。2. 使用与类型没有那么紧密耦合的二进制序列化器以外的其他东西(如XML或JSON序列化器-如您所尝试的)。

相关内容

  • 没有找到相关文章

最新更新