С # [анонимный \ общий] объект в byte [] без BinaryFormatter [в .NET 4.5]?

BinaryFormatter отлично работает, но не существует в переносимых библиотеках классов для .NET 4.5.

Я читал, что он есть в .NET 4.6 Portable. Я не подтвердил это, потому что, когда я перехожу на 4.6 в настройках своего проекта, я получаю предупреждающее сообщение о том, что «4.5 будет автоматически выбран», если я не отключу Silverlight, WindowsPhone, Windows Universal, Xamarin и т. Д.), Поэтому я могу только target .NET 4.6 Portable, если я НЕ нацеливаюсь на дополнительные платформы, что противоречит цели.

Вот мой оригинальный BinarySerializer (работает, но НЕ PCL, потому что использует BinaryFormatter)

private string BinarySerialize(object Source)
{
    byte[] serializedObject;
    using (MemoryStream stream = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, Source);
        serializedObject = stream.ToArray();
    }
    return Convert.ToBase64String(serializedObject);
}

Итак, как уже было сказано, я начал пытаться переписать свой BinarySerializer, чтобы использовать BinaryReader и BinaryWriter, которые доступны в PCL, и столкнулся со следующими проблемами:

BinaryWriter, может обрабатывать только простые типы (например, string, bool, byte, long, int и т. Д.) И Streams, поэтому думаю, мне нужно найти способ преобразовать анонимные объекты в Stream.

Я на правильном пути? Как преобразовать типы, которые неизвестны до времени выполнения (например, System.Delegate - и да, я знаю, что сериализация делегатов приводит к нестабильному коду) или анонимные \ общие типы в их эквивалентный массив байтов byte[]? Есть ли способ преобразовать объект напрямую в Stream или MemoryStream?

Если это вообще невозможно, как бы вы порекомендовали мне написать interface для моего BinarySerializer, чтобы я мог реализовать функциональность в своей переносимой библиотеке классов, в то время как фактические классы BinaryFormatter, реализующие interface, существуют в сборках, зависящих от платформы?

К вашему сведению, это проект MVVM, в котором «сериализаторы» считаются моделями, производными от ValueConverter абстрактного базового класса. Сериализация используется только для транспортировки созданных задач к месту назначения для выполнения.


person epicTurk    schedule 30.03.2016    source источник
comment
Почему вы все равно сериализуете? И чего вы ожидаете от сериализации делегата? Делегаты в основном связаны с кодом, который не сериализуется.   -  person D Stanley    schedule 30.03.2016
comment
Я теоретизирую интерфейс построения правил, который строит Serializable Conditions, который впоследствии может быть десериализован и выполнен для набора данных. Я пытаюсь разрешить настраиваемые (типизированные) правила (любые Func<dataTypeT,bool>), а также разрешить существование Func<dataTypeT> вместо фактического dataTypeT в параметрах Condition. Спасибо   -  person epicTurk    schedule 30.03.2016
comment
Ну, вы не можете сериализовать методы (по крайней мере, не используя методы, которые вы используете сейчас), поэтому я не уверен, что ваш дизайн будет работать.   -  person D Stanley    schedule 30.03.2016
comment
BinaryFormatter может сериализовать что угодно, включая статические делегаты, действия и функции, в byte []. Единственная проблема в том, что BinaryFormatter не существует в Portable .NET 4.5.   -  person epicTurk    schedule 30.03.2016
comment
BinaryFormatter также печально известен тем, что создает проблемы с версией, если вы позже добавите что-то новое в типы, тогда класс BinaryFormatter, скорее всего, больше не будет десериализовать ваши данные. Двоичная сериализация подразумевается как транспортный формат, а не как формат хранения.   -  person Lasse V. Karlsen    schedule 04.05.2016
comment
Спасибо, @ LasseV.Karlsen - это именно то, что мне нужно, чтобы использовать его в качестве универсального транспортного формата, чтобы отправлять команды построения задач в их пункт назначения (один компьютер \ приложение \ сервис на другой) и выполнять их в заранее определенных условиях (делегаты) .   -  person epicTurk    schedule 04.05.2016
comment
BinaryFormatter не поддерживается в переносимой библиотеке классов (согласно документации, в которой отсутствует какое-либо упоминание) и, вероятно, никогда не будет, потому что он поддерживает инфраструктуру удаленного взаимодействия, а удаленное взаимодействие в целом считается устаревшим (за исключением доменов приложений, но это также выходит за рамки PCL). Тем не менее, существуют некоторые независимые усилия.   -  person Jeroen Mostert    schedule 04.05.2016