C # десериализация с использованием отражения - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть .dll, которая десериализует класс.Когда я называю это .dll из проекта или не используя отражения, он работает нормально.Когда я вызываю .dll с помощью отражения, я получаю сообщение об ошибке в строке, которая десериализуется.Я знаю, что это связано с изоляцией, которая возникает, когда я использую отражение для загрузки сборки.Хотите знать, есть ли у кого-нибудь исправление или идея, как это реализовать?Кстати, сериализация работает просто отлично, просто не работает десериализация.

Я пробовал и двоичный файл, и XML, вот код:

static public object SerializeLoad(string sFilename)
        {
            try
            {
                List<ElementTodo> _object = null;//ElementTodo _object = null;
                Stream stream = File.Open(sFilename, FileMode.Open);
                //BinaryFormatter bformatter = new BinaryFormatter();
                XmlSerializer bformatter = new XmlSerializer(typeof(ElementTodo), "ToDo");

                //_object = (_object.GetType())bformatter.Deserialize(stream);

                _object = (List<ElementTodo>)bformatter.Deserialize(stream);
                stream.Close();
                return _object;
            }
            catch(Exception e)
            {
                string error = e.Message;
                return null;
            }
        }

Сгенерированный XML выглядит следующим образом:

<</p>

?xml version="1.0"?> 
  <ArrayOfElementTodo xmlns:xsi="w3.org/2001/XMLSchema-instance"; xmlns:xsd="w3.org/2001/XMLSchema"; xmlns="ToDo"> 
      <ElementTodo Title="a" content="aa" isDone="false" /> 
      <ElementTodo Title="b" content="bb" isDone="false" /> 
      <ElementTodo Title="c" content="cc" isDone="false" /> 
      <ElementTodo Title="d" content="dd" isDone="false" /> 
  </ArrayOfElementTodo>

1 Ответ

2 голосов
/ 26 апреля 2011

Я предполагаю, что ElementTodo находится в сборке, к которой и ваш код, и сборка, загруженная с использованием отражения, имеют доступ?Вы должны быть осторожны, чтобы ваша загруженная сборка использовала ту же зависимую сборку и не загружала новую копию.В противном случае вы получите забавные ошибки, такие как «Объект X (типа ElementTodo) не относится к типу ElementTodo», поскольку загружаются две копии типов.Трудно сказать наверняка, что это ваша проблема, без дополнительной информации о конкретной ошибке.как это:

В вашем коде запуска где-то:

        //This is required because we load assemblies at runtime
        //If this is not used, there can be problems when Reflecting over Types
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

Реализация:

    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        return AppDomain.CurrentDomain.GetAssemblies().
            FirstOrDefault(assembly => assembly.FullName == args.Name);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...