BinaryFormatter无法将对象反序列化为相同类型

时间:2017-01-19 13:02:33

标签: c# serialization

我使用BinaryFormatter来序列化动态加载的程序集中存在的类型的对象。我们的想法是序列化对象,通过网络发送它,然后反序列化并使用它。但是我收到了这个错误:

  

[A] Samples.RecordKeeping.Person无法转换为   [B] Samples.RecordKeeping.Person。 A型来自'样品,   上下文中的Version = 1.0.3.0,Culture = neutral,PublicKeyToken = null'   位于'C:\ Samples.dll'的'默认'。 B型起源于   'Samples,Version = 1.0.3.0,Culture = neutral,PublicKeyToken = null'in   位于'C:\ Temp \ Samples.dll'的上下文'LoadFrom'。“}

两个大会都是一样的。即从同一位置复制,因此它们不能具有命名空间或其他类型名称问题。两个程序集都在发送和接收位置动态加载到AppDomain中

类声明是这样的:

namespace Samples.RecordKeeping
{
    [Serializable]
    public class Person
    {
       public int Id { get; set; }
       public string Name { get; set; }
       public string Notes { get; set; }
    }
}

    private INodeTask LoadUserCode()
    {
        INodeTask ret = null;

        try
        {
            var type = typeof(AssemblyLoader);
            var loader = (AssemblyLoader) AppDomain.CurrentDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
            var assembly = loader.GetAssembly(_assembly);
            var filename =Path.GetFileNameWithoutExtension(_assembly);

            foreach (var it in assembly.GetTypes())
            {
                if (string.Compare(it.Name, _class, true) == 0)
                {
                    ret = assembly.CreateInstance(it.FullName, true,
                        BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance,
                        null, null, CultureInfo.CurrentCulture,
                        null) as INodeTask;
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            _journal.Error(ex, $"Failed to load assembly {_assembly} for {_class}");
        }

        return ret;
    }



class AssemblyLoader : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        var assembly = (Assembly) null;
        try
        {
            if (File.Exists(assemblyPath))
                assembly = Assembly.LoadFrom(assemblyPath);
            else
                throw new FileNotFoundException($"could not find {assemblyPath}");
        }
        catch (Exception ex)
        {
            throw;
        }
        return assembly;
    }
}

0 个答案:

没有答案