Как я могу сериализовать делегатов в моем приложении WP7 - PullRequest
2 голосов
/ 05 февраля 2012

Я создаю приложение для WP7. И я работаю над надгробной частью моего приложения.

И у меня есть такой класс, что

namespace packetq{
    public class Packet{
        int x;
        //some other information;
    }
}  

namespace packetq{
    public class PacketState{
        Packet A;
        func<Packet,Packet>   handler;
    }
}

Теперь у меня есть класс, который создает экземпляр объекта Packet и назначает ему обработчик.

когда моё приложение надгробий. Мне нужно сохранить этот объект PacketState, чтобы при его восстановлении я смог работать с этим пакетом, а также мог обрабатывать этот пакет с помощью этого обработчика.

Так что мне нужно сериализовать и сохранить этот обработчик.

Я прочитал несколько статей, в которых говорится, что сохранение и сериализация могут быть выполнены с использованием дерева выражений. Но этот путь действительно громоздок.

Пожалуйста, предложите другой способ сделать это.

1 Ответ

2 голосов
/ 05 февраля 2012

Поскольку BinaryFormatter недоступен, мой совет: используйте вместо этого экземпляр класса (подкласс общего базового типа) и полиморфный метод, возможно, с использованием шаблона декоратора. Я не знаю, какой сериализатор вы планируете использовать, но большинство может обрабатывать наследование, если подтипы известны заранее.

Таким образом, вместо Func<Packet,Packet> у вас может быть базовый класс PacketHandler с виртуальным методом, который принимает и возвращает Packet

Для уточнения:

[DataContract, KnownType(typeof(EchoPacketHandler)]
public class PacketHandler {
    public virtual Packet Handle(Packet packet) { throw new NotSupportedException(); }
}
[DataContract]
public class EchoPacketHandler : PacketHandler {
    public override Packet Handle(Packet packet) { return packet; }
}

Но добавьте больше подклассов и при необходимости укажите состояние через [DataMember].

...