0

这是我第一次接触序列化...事实上我正在通过 C# 开发 Autodesk Revit。

客观的:

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

程序:

  1. 处理所有必需的数据。来自 Main 类。
  2. 实例化这些数据并将其传递给 Serializable 类。
  3. 保存以归档来自主类的数据。
  4. 释放流并将可序列化类设置为空。
  5. 反序列化。
  6. 根据获取的数据在 revit 上做一些事情。

问题 - 程序完美运行,没有错误,一切正常。- 再次按下按钮以重新运行在反序列化时失败的程序,并显示此错误代码

[A]Cons_Coor.ThrDviewData 无法转换为 [B]Cons_Coor.ThrDviewData。类型 A 源自位置 'C:\Users\mostafa\AppData\Local\Temp\RevitAddins\Cons_Coor-Executing-20140820_224454_4113 的上下文 'LoadNeither' 中的 'Cons_Coor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' \Cons_Coor.dll'。类型 B 源自位置 'C:\Users\mostafa\AppData\Local\Temp\RevitAddins\Cons_Coor-Executing-20140820_230011_0316 的上下文 'LoadNeither' 中的 'Cons_Coor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' \Cons_Coor.dll'。在 Cons_Coor.dll 中发生了“System.NullReferenceException”类型的第一次机会异常

主类:

///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 Data\r\n");
            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);
    }


}

所以有什么提示吗?

4

1 回答 1

1

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

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

事情就是这样...

于 2014-08-22T20:54:10.680 回答