BinaryFormatter не существует в CF. Решения? - PullRequest
8 голосов
/ 23 февраля 2011

Мне нужно сериализовать / десериализовать obj в / из байта [] на компактной платформе, но нет BinaryFormatter, что мне делать?Благодарю.Это класс, который я использую на стороне сервера, и я хочу, чтобы он был также на клиенте (устройство с Windows Mobile 6)

public class Serializer
{
    public byte[] SerializeObject(object obj)
    {
        if (obj == null)
            return null;
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, obj);
            return stream.ToArray();
        }
    }

    public object DeserializeObject(byte[] bytes)
    {
        if (bytes == null)
            return null;
        BinaryFormatter formatter = new BinaryFormatter();
        MemoryStream stream = new MemoryStream(bytes);
        return formatter.Deserialize(stream);
    }
}

Ответы [ 4 ]

10 голосов
/ 23 февраля 2011

Для вашего сценария вы можете рассмотреть возможность переключения protobuf-net ; это не тот же формат, что и BinaryFormatter, поэтому и клиенту, и серверу потребуются настройки, но это двоичный API-интерфейс сериализации, который работает на обеих платформах, а обычно намного меньше в качестве дополнительного дополнения. Формат на самом деле является кодировкой "буферов протокола" от Google; очень быстрый, независимый от платформы и разработанный для обеспечения гибкости при добавлении свойств и т. д. И это бесплатно. Какой-то дурак просто отдает это.

3 голосов
/ 23 февраля 2011

Первоначально мы использовали настолько хорош, насколько он получает компактную платформу Сериализация , которая полностью совместима с двоичной версией с полной платформой BinaryFormatter, но лицензирование для каждого устройства стало преградой. В зависимости от того, сколько устройств вам нужно поддерживать, он может работать на вас. Мы также обнаружили, что у BinaryFormatter действительно есть накладные расходы памяти и времени - не слишком близко к стоимости SoapFormatter, но все же важно для устройства CE.

В конце мы создали инфраструктуру сериализации, используя BinaryWriter и BinaryReader непосредственно вместе с System.Activator для создания классов. Это позволило нам убрать значительную часть памяти и временных затрат, связанных со встроенной сериализацией, за счет тщательного управления версиями объектов и упорядочения полей. Следует отметить, что наша работа по пользовательской сериализации предшествовала выпуску protbuf.net .

2 голосов
/ 23 февраля 2011

вы можете найти реализацию того, что вам нужно для CF здесь: http://www.codeproject.com/KB/cs/CF_serializer.aspx

также интересно: как сериализовать объекты в компактной среде

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

0 голосов
/ 23 февраля 2011

Из MSDN Различия между .NET Compact Framework и .NET Framework :

Сериализация

Из-за размера и производительности .NET Compact Framework не поддерживает двоичную сериализацию с использованием BinaryFormatter или сериализацию SOAP с использованием SoapFormatter.

Однако .NET Compact Framework обеспечивает поддержку сериализации для передачи данных объекта с помощью SOAP в веб-службах XML и сериализации наборов данных в XML.

...