Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以序列化,但不能反序列化?_C#_Serialization_Poco_T4 - Fatal编程技术网

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

C# 可以序列化,但不能反序列化?,c#,serialization,poco,t4,C#,Serialization,Poco,T4,我已经为EF4.0创建了带有T4模板的POCO类,并为上下文生成了mock。一切都很好,但我不喜欢在C#代码中初始化哪怕是很小的模拟数据库,所以我创建了一些从真实数据库生成模拟数据库的函数,我想序列化这个对象,并在以后的一些单元测试中使用它 XML序列化失败,所以我尝试了二进制序列化,序列化成功,但反序列化失败 反序列化程序找不到程序集“EntityFrameworkDynamicProxies-”。我怎样才能反序列化这样的东西(DynamicProxy?)。动态代理只按需存在,所以序列化的选择

我已经为EF4.0创建了带有T4模板的POCO类,并为上下文生成了mock。一切都很好,但我不喜欢在C#代码中初始化哪怕是很小的模拟数据库,所以我创建了一些从真实数据库生成模拟数据库的函数,我想序列化这个对象,并在以后的一些单元测试中使用它

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


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

动态代理只按需存在,所以序列化的选择很差。XML的错误是什么?最终,我希望您在这里的最佳选择是使用DTO层,但这也可能与其他一些序列化程序进行序列化。例如,您是否尝试过DataContactSerializer,它可能能够应对这种情况?我一直在为我自己的序列化程序添加代理支持,但我还没有尝试使用ef4。

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

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

我有一个类似的问题,我可以通过在mvc web应用程序的应用程序启动中这样做来解决(部分)


试一试。

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

string file=“data.bin”;
使用(var ctx=new DataContext())
{
BinaryFormatter bf=新的BinaryFormatter();
bf.Binder=新的MyBinder();
实体e;
使用(var s=File.OpenRead(File))
e=(实体)bf.反序列化;
ctx.实体。添加(e);
ctx.SaveChanges();
File.Move(File,Path.Combine(archiveFolder,Path.GetFileName(File)));
}
类MyBinder:SerializationBinder
{
词典类型;
公共MyBinder()
{
types=typeof(Entity.Assembly.GetTypes().Where(t=>t.Namespace==“Foo.Model”).ToDictionary(t=>t.Name,t=>t);
}
公共重写类型BindToType(字符串assemblyName、字符串typeName)
{
if(assemblyName.Contains(“EntityFrameworkDynamics代理Foo”))
{
var type=typeName.Split('.').Last().Split('.').First();
返回类型[类型];
}
var returnType=Type.GetType(String.Format(“{0},{1}”,typeName,assemblyName));
返回类型;
}
}

序列化程序是否在单独的程序集中?您的意思是与POCO类不同?Serializer位于TestProject和Poco类中,生成的Mock位于单独的项目中,仅包含模型,因此它们位于单独的程序集中。我不知道,这是否值得我付出努力。我只想创建大数据库的一小部分,以便在单元测试中轻松使用。它应该是静态的,所以我认为序列化将是最好和最快的方法。我没有尝试DataContractSerializer,但我也在考虑其他可能的方法。。。有没有办法从代理对象中获取真实对象?我现在正在做的是遍历数据库,起点是一个实体,我正在获取所有依赖项,并将它们添加到MockContext(基于列表),所以在将对象添加到MockContext的过程中,可能会跳过代理。可能吗?通过XML序列化时,我遇到了XmlInclude错误。序列化程序发现意外的类型,我应该将XmlInclude添加到静态未知的类型中…@Simon-是的,这是我所期望的,但我想确定。我对EF实现的了解还不够,所以不知道这一点,但这在NHibernate中是可能的,我希望这是可能的。但你必须用谷歌搜索它。DTO更简单…我知道NHibernate能够做到这些:)但不幸的是,我必须处理EF4.0。我不认为DTO更好,我想避免它。我试过用谷歌搜索它,但没那么容易:)@Simon-试试
ProxyDataContractResolver
+
DataContractSerializer
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;
    }
}