Может сериализовать, но не может десериализовать? - PullRequest
2 голосов
/ 25 сентября 2010

Я создал классы POCO с шаблонами T4 для EF 4.0 и сгенерировал макет для Context.Все было замечательно, но я не люблю инициализировать даже небольшой Mock-DB в коде C #, поэтому я создал несколько функций, которые генерируют Mock-DB из реальной БД, и я хотел сериализовать этот объект и использовать его позже в каком-то модулеТесты ...

Сериализация XML не удалась, поэтому я попытался сериализовать двоичные данные и сериализация прошла успешно, но десериализация не удалась.

Десериализатор не может найти сборку "EntityFrameworkDynamicProxies-".Как я могу десериализовать такую ​​вещь (DynamicProxy?) ...

Ответы [ 3 ]

1 голос
/ 19 декабря 2010

Если вы сначала создаете свой экземпляр класса из контекста сущности в приложении, то десериализуете его, он может работать для вас. Так что в вашем приложении, которое должно десериализовать это, попытайтесь сделать что-то вроде

context.YourSerializedObjectType.CreateObject (); где context - это экземпляр контекста объекта вашей сущности.

У меня была похожая проблема, которую я смог обойти (частично), выполнив это в Application_Start веб-приложения mvc

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

Вихрь.

1 голос
/ 10 февраля 2014

Мне удалось решить эту проблему, зарегистрировав пользовательский SerializationBinder с BinaryFormatter: (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;
    }
}
1 голос
/ 25 сентября 2010

Динамические прокси существуют только по требованию, поэтому плохой выбор для сериализации.Какая нам ошибка с XML?В конечном счете, я ожидаю, что ваш лучший вариант - использовать слой DTO, но может также сериализоваться с некоторыми другими сериализаторами.Например, вы пробовали DataConttactSerializer, который может справиться?Я добавляю поддержку прокси в свой собственный сериализатор, но еще не пробовал с ef4.

...