Проблема с десериализацией
От: PavelAndreevich Россия  
Дата: 26.06.09 09:03
Оценка:
Есть проект(ThreadTracking) в потором есть форма(ThreadTracking.cs) и файл(ThreadTrackingCommon.cs).
В файле ThreadTrackingCommon.cs опреденлен класс ThreadTrackingSettings.
Есть форма:
public partial class ThreadTracking : Form
{
    private TrackersCollection m_TrackersList = new TrackersCollection();
    private ThreadTrackingSettings m_ThreadTrackingSettings = new ThreadTrackingSettings();
    ...
    public void SaveState( string FileNamePrefix )
    {
        FileStream sw = new FileStream( FileNamePrefix + GetType().Name + ".bin", FileMode.Create, FileAccess.Write );
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize( sw, m_TrackersList );
        bf.Serialize( sw, m_ThreadTrackingSettings );
        sw.Close();
    }
    ...
    public void LoadState( string FileNamePrefix )
    {
        FileStream fs = new FileStream( FileNamePrefix + GetType().Name + ".bin", FileMode.Open, FileAccess.Read );
        BinaryFormatter bf = new BinaryFormatter();
        m_TrackersList = bf.Deserialize( fs ) as TrackersCollection;
        m_ThreadTrackingSettings = bf.Deserialize( fs ) as ThreadTrackingSettings;
        fs.Close();
    }
}


На строке с десереализацией класса ThreadTrackingSettings программа падает с ошибкой "Не удалось найти сборку "ThreadTracking, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null". Хотя все эти файлы лежат в одном проекте.Классы TrackersCollection и ThreadTrackingSettings помечены как Serializable.
Подскажите в чем проблема?
Заранее спасибо!
Re: Проблема с десериализацией
От: Smarty Россия  
Дата: 26.06.09 15:12
Оценка:
Здравствуйте, PavelAndreevich, Вы писали:

PA>Заранее спасибо!


Так сразу ничего в голову не приходит... Можете минимальный проект с ошибкой в зип-е выложить куда-нить?
Re: Проблема с десериализацией
От: PavelAndreevich Россия  
Дата: 29.06.09 09:42
Оценка:
Проблема решилась следующим путем:

    public class Binder : SerializationBinder
    {
        public override Type BindToType( string assemblyName, string typeName )
        {
            Type tyType = null;
            string sShortAssemblyName = assemblyName.Split( ',' )[0];
            System.Reflection.Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();

            foreach( System.Reflection.Assembly ayAssembly in ayAssemblies )
            {
                if( sShortAssemblyName == ayAssembly.FullName.Split( ',' )[0] )
                {
                    tyType = ayAssembly.GetType( typeName );
                    break;
                }
            }
            return tyType;
        }
    }


При десериализации указываем:
BinaryFormatter bf = new BinaryFormatter();
bf.Binder = new Binder();
m_TrackersList = bf.Deserialize( fs ) as TrackersCollection;
m_ThreadTrackingSettings = bf.Deserialize( fs ) as ThreadTrackingSettings;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.