我使用T4模板为EF 4.0创建了POCO类,并为Context生成了模拟。一切都很棒,但我不喜欢在C#代码中初始化甚至小Mock-DB,所以我创建了一些从真实数据库生成Mock-DB的函数,我想要序列化这个对象,稍后在某个单元中使用它测试...
XML序列化失败,所以我尝试了二进制序列化和序列化成功,但反序列化失败了。
反序列化器无法找到程序集“EntityFrameworkDynamicProxies-”。我怎样才能反序化这样的东西(DynamicProxy?)......
答案 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;
}
}