BinaryFormatter десериализует поле делегата после изменения в классе - PullRequest
0 голосов
/ 04 января 2019

Используя BinaryFormatter в C #, я пытаюсь десериализовать объекты из класса, который содержит свойство делегата.

После добавления члена в класс, указанный делегатом, десериализация прерывается. Смотрите пример ниже.

Мне понадобится десериализация для работы, даже если я полностью проигнорирую проблематичное свойство делегата. Например, если свойство делегата всегда десериализовано для обнуления, проблема будет решена. Я не смог решить его, пометив свойство как [NonSerialized] или изменив его на поле.

Следующее будет описывать сериализованные объекты, которые я пытаюсь десериализовать.

public class mySerializedClass
{
    public string thisIsOK1 {get; set;}
    public string thisIsOK2 {get; set;}
    public Func<myModelClass,bool> thisIsTheIssue {get; set;}
}

[Serializable]
public class myModelClass
{
    // The issue happened after adding a new method to this class

    public static bool testMethod(mySerializedClass obj)
    {
        // do stuff
        return true
    }
}

Как пример сериализованного экземпляра:

new mySerializedClass()
{
    thisIsOK1 = "a";
    thisIsOK2 = "b";
    thisIsTheIssue = (o) => myModelClass.testMethod(o);    
}

Правильным решением было бы всегда сериализовать / десериализовать свойство thisIsTheIssue в null.

В качестве дополнительной информации сообщение об исключении:

Невозможно получить член 'get_theNameOfMyDelegate b__19_0'.

И StackTrace Исключения:

в System.Reflection.MemberInfoSerializationHolder.GetRealObject (StreamingContext контекст) в System.Runtime.Serialization.ObjectManager.ResolveObjectReference (ObjectHolder держатель) в System.Runtime.Serialization.ObjectManager.DoFixups ()
в System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (HeaderHandler обработчик, __BinaryParser serParser, логический fCheck, логический isCrossAppDomain, IMethodCallMessage methodCallMessage) в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (Stream serializationStream, обработчик HeaderHandler, логическое значение fCheck, логическое значение isCrossAppDomain, IMethodCallMessage methodCallMessage) в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (Stream serializationStream) в ... месте моего кода, где я десериализовываю ...

1 Ответ

0 голосов
/ 04 января 2019

Я бы рассмотрел классы управления версиями или отделения вашего транспорта от вашего рабочего класса.

Таким образом, вы можете иметь mySerializedClass, но затем иметь myWorkingClass

, который содержит делегата. При сериализации и десериализации вы должны загрузить и сохранить myWorkingClass в ваш mySerializedClass и обратно. После этого вы можете делать разные вещи, например, иметь разные версии mySerializedClass, поскольку ваше приложение приобретает новые возможности.

...