【问题标题】:Can serialize, but cannot deserialize?可以序列化,但不能反序列化?
【发布时间】:2011-04-17 00:39:02
【问题描述】:

我已经为 EF 4.0 创建了带有 T4 模板的 POCO 类,并为 Context 生成了模拟。一切都很棒,但我不喜欢在 C# 代码中初始化甚至小的 Mock-DB,所以我创建了一些从真实 DB 生成 Mock-DB 的函数,我想序列化这个对象并稍后在某个单元中使用它测试...

XML序列化失败,所以我尝试了二进制序列化并且序列化成功,但是反序列化失败了。

反序列化程序找不到程序集“EntityFrameworkDynamicProxies-”。我怎样才能反序列化这样的东西(DynamicProxy?)...

【问题讨论】:

  • 序列化程序是否在单独的程序集中?
  • 您的意思与 POCO 课程不同?序列化器在 TestProject 和 Poco 类中,生成的模拟在单独的项目中,只有模型,所以是的,它们在单独的程序集中。

标签: c# serialization poco t4


【解决方案1】:

我通过使用 BinaryFormatter 注册自定义 SerializationBinder 成功地解决了这个问题:(EF6)

string file = "data.bin";
using (var ctx = new DataContext())
{
    BinaryFormatter bf = new BinaryFormatter();
    bf.Binder = new MyBinder();

    Entity e;
    using (var s = File.OpenRead(file))
        e = (Entity)bf.Deserialize(s);

    ctx.Entities.Add(e);
    ctx.SaveChanges();

    File.Move(file, Path.Combine(archiveFolder, Path.GetFileName(file)));
}



class MyBinder : SerializationBinder
{
    Dictionary<string, Type> types;

    public MyBinder()
    {
        types = typeof(Entity).Assembly.GetTypes().Where(t => t.Namespace == "Foo.Model").ToDictionary(t => t.Name, t => t);
    }

    public override Type BindToType(string assemblyName, string typeName)
    {
        if (assemblyName.Contains("EntityFrameworkDynamicProxies-Foo"))
        {
            var type = typeName.Split('.').Last().Split('_').First();
            return types[type];
        }

        var returnType = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));
        return returnType;
    }
}

【讨论】:

    【解决方案2】:

    如果您首先从应用程序中的实体上下文创建类的实例并对其进行反序列化,它可能对您有用。因此,在您要反序列化的应用程序中,尝试执行类似

    context.YourSerializedObjectType.CreateObject(); 其中 context 是您的实体对象上下文的一个实例。

    我有一个类似的问题,我可以通过在 mvc Web 应用程序的 Application_Start 中执行此操作(部分)解决

    http://completedevelopment.blogspot.com/2010/09/aspnetmvcentity-framework-error-unable.html

    试一试。

    【讨论】:

      【解决方案3】:

      动态代理仅按需存在,因此序列化的选择很差。 XML 的错误是什么?最终,我希望您最好的选择是使用 DTO 层,但是 可能 也可以使用其他一些序列化程序进行序列化。比如你试过DataConttactSerializer,它或许能应付?我一直在为自己的序列化程序添加代理支持,但我还没有尝试使用 ef4。

      【讨论】:

      • 我不知道,是否值得我努力。我只想创建大数据库的一小部分,可以在单元测试中轻松使用。它应该是静态的,所以我认为序列化将是最好和最快的方法。我没有尝试过 DataContractSerializer,但我也在考虑其他可能性......有没有办法从代理对象获取真实对象?我现在正在做的是遍历数据库,起点是一个实体,我正在获取所有依赖项,将它们添加到 MockContext(基于 List),所以在将对象添加到 MockContext 期间,我可以跳过代理。有可能吗?
      • 通过 XML 进行序列化时,出现 XmlInclude 错误。序列化程序发现意外类型,我应该将 XmlInclude 添加到静态未知的类型...
      • @Simon - 是的,这正是我所期望的,但我想确定一下。我对 EF 实现知之甚少,无法了解这一点,但 NHibernate is 是可能的,我希望它是可能的。但是你必须谷歌它。 DTO 更简单...
      • 我知道 NHibernate 有能力做这样的事情 :) 但不幸的是,我必须处理 EF 4.0。我不认为 DTO 更好,我想避免它。我试过用谷歌搜索它,但这并不容易:)
      • @Simon - 试试ProxyDataContractResolver + DataContractSerializer? msdn.microsoft.com/en-us/library/dd456853.aspx
      猜你喜欢
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 2023-03-15
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多