Десериализовать Revit API

Это мой первый раз, когда я начинаю понимать сериализацию... на самом деле я занимаюсь разработкой Autodesk Revit через C#.

Задача:

Мне нужно записать данные в новый файл на жестком диске, чтобы этот файл можно было открыть с другого компьютера через Revit.

Процедура:

  1. Обработка всех необходимых данных. Главный класс.
  2. Создайте и передайте эти данные в сериализуемый класс.
  3. Сохранить в файл данных из основного класса.
  4. Удалите поток и установите сериализуемый класс в нуль.
  5. Deserialize.
  6. Делать вещи на ревит на основе полученных данных.

Проблема- программа работает без ошибок и все в порядке. - нажмите кнопку еще раз, чтобы перезапустить программу, которая не удалась при десериализации с этим кодом ошибки

[A]Cons_Coor.ThrDviewData нельзя преобразовать в [B]Cons_Coor.ThrDviewData. Тип A происходит от 'Cons_Coor, версия =1.0.0.0, культура = нейтральная, PublicKeyToken=null' в контексте 'LoadNeither' в местоположении 'C:\Users\mostafa\AppData\Local\Temp\RevitAddins\Cons_Coor-Executing-20140820_224454_4113\Cons_Coor.dll. Тип B происходит от 'Cons_Coor, версия =1.0.0.0, культура = нейтральная, PublicKeyToken=null' в контексте 'LoadNeither' в местоположении 'C:\Users\mostafa\AppData\Local\Temp\RevitAddins\Cons_Coor-Executing-20140820_230011_0316\Cons_Coor.dll'. Первое случайное исключение типа System.NullReferenceException произошло в Cons_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 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);
    }


}

так какие-нибудь намеки?

1 ответ

Используемый вами двоичный сериализатор очень тесно связан с классом, который вы экспортируете. Когда вы используете менеджер надстроек Revit для загрузки своего надстройки, он создает динамическую копию вашей сборки (чтобы вы могли вернуться и загрузить ее снова, находясь в том же сеансе). Когда это происходит, вы получаете дубликаты типов с одинаковыми именами (ThrDviewData). Когда вы пытаетесь загрузить ранее сериализованный двоичный файл, который был из другой копии, он все еще пытается сопоставить исходный тип (не новую копию типа).

Ваш выбор: 1. Не используйте менеджер надстроек, просто статически используйте надстройку. 2. Используйте что-то кроме двоичного сериализатора, который не так тесно связан с типами (например, сериализатор XML или JSON - как вы пытались).

Вот что случилось...

Другие вопросы по тегам