Как сериализовать/десериализовать объект, загруженный из другой сборки?

Я хочу сериализовать/десериализовать объект, который был инстанцирован другим объектом, загруженным из сборки:

Interfaces.cs (из ссылающейся сборки, Interfaces.dll)

public interface ISomeInterface
{
 ISettings Settings { get; set; }
}

public interface ISettings : ISerializable
{
 DateTime StartDate { get; }
}

SomeClass.cs (из ссылающейся сборки, SomeClass.dll)

public class SomeClass : ISomeInterface
{
 private MySettings settings = new Settings();

 public ISettings Settings
 {
  get { return (ISettings)settings; }
  set { settings = value as MySettings; }
 }
}

[Serializable]
public class MySettings : ISettings
{
 private DateTime dt;

 public MySettings() { dt = DateTime.Now; }

 protected MySettings(SerializationInfo info, StreamingContext context)
 {
  dt = info.GetDateTime("dt");
 }

 [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
 public void GetObjectData(SerializationInfo info, StreamingContext context)
 {
  info.AddValue("dt", dt);
 }

 public DateTime StartDate
 {
  get { return startFrom; }
  internal set { startFrom = value; }
 }
}

Проект запуска:

[Serializable]
public class ProgramState
}
 public ISettings Settings { get; set; }
}

В проекте запуска, в конечном итоге, я устанавливаю Settings экземпляра ProgramState в Settings SomeClass. Затем я выполняю сериализацию с помощью:

public void SerializeState(string filename, ProgramState ps)
{
 Stream s = File.Open(filename, FileMode.Create);
 BinaryFormatter bFormatter = new BinaryFormatter();
 bFormatter.Serialize(s, ps);
 s.Close();
}

Это не вызывает никаких исключений. Я десериализую с помощью:

public ProgramState DeserializeState(string filename)
{
 if (File.Exists(filename))
 {
  ProgramState res = new ProgramState();
  Stream s = File.Open(filename, FileMode.Open);
  BinaryFormatter bFormatter = new BinaryFormatter();
  try
  {
   res = (ProgramState)bFormatter.Deserialize(s);
  }
  catch (SerializationException se)
  {
   Debug.WriteLine(se.Message);
  }
  s.Close();
  return res;
 }
 else return new ProgramState();
}

Это вызывает исключение, и в выводе Debug появляется следующее:

В mscorlib.dll произошло исключение первого шанса типа 'System.Runtime.Serialization.SerializationException'
. Unable to find assembly 'SomeClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Я уверен, что сборка, содержащая SomeClass, была загружена до вызова DeserializeState, так почему же она выбрасывает исключение, что не может ее найти?

Я просмотрел некоторые учебники, но те, которые мне удалось найти, касаются только классов из одной сборки (к тому же, мое понимание процесса сериализации и десериализации в .NET минимально - ссылка на подробное объяснение могла бы быть полезной).

Тем временем, есть ли способ заставить это правильно десериализовать объект MySettings?

11
задан Kiquenet 26 February 2013 в 11:16
поделиться