可以序列化,但不能反序列化?

时间:2010-09-24 22:21:02

标签: c# serialization poco t4

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

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

的操作

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

我有一个类似的问题,我可以在一个mvc网络应用程序的Application_Start

中这样做(部分)

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

给它一个旋转。

答案 2 :(得分: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;
    }
}