C # двоичная сериализация - PullRequest
       169

C # двоичная сериализация

3 голосов
/ 09 октября 2009

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

Я немного осмотрелся, используя BinaryFormater, но не знаю, даст ли он мне необходимый контроль.

EDIT:

Я бы хотел украсить класс следующим (Где поля могут быть любого типа, если они являются системным типом или также [Сериализуемыми])

[Serializable]
public class MyClass {

    [NonSerialized]
    SomeOtherClass _classFeild;

    [Position (0)]
    UInt16 _field1;

    [Position (14)]
    UInt32 _feild2;

    //..........
}

И имеют следующие функциональные возможности,

void Test () {
    MyObject = new MyClass ();
    Byte[] raw;
    raw  =  Serializer.Serialize (MyClass); // Results in _field1 at raw[0,1]
                                            //            _field2 at raw[14-18]

    MyClass Deserialized  = Serializer.Deserialize<MyClass> (raw); 
}

где все поля поменялись местами в / из сетевого порядка (бигендия)


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

Ответы [ 4 ]

3 голосов
/ 09 октября 2009

Похоже, что подходит для BinaryWriter и BitConverter .

1 голос
/ 26 февраля 2013

BinarySerializer сделает все это и даже больше.

0 голосов
/ 06 апреля 2016

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

Выезд: https://github.com/Toxantron/CGbR#binary-datacontract-serializer

В данный момент вводом являются атрибуты DataContract и DataMember

[DataContract]
public partial class Root
{
    [DataMember]
    public int Number { get; set; }

    [DataMember]
    public Partial[] Partials { get; set; }

    [DataMember]
    public IList<ulong> Numbers { get; set; }
}

и выход генератора

    public byte[] ToBytes(byte[] bytes, ref int index)
    {
        // Convert Number
        Buffer.BlockCopy(BitConverter.GetBytes(Number), 0, bytes, index, 4);;
        index += 4;
        // Convert Partials
        // Two bytes length information for each dimension
        Buffer.BlockCopy(BitConverter.GetBytes((ushort)(Partials == null ? 0 : Partials.Length)), 0, bytes, index, 2);
        index += 2;
        foreach(var value in Partials ?? Enumerable.Empty<Partial>())
        {
            value.ToBytes(bytes, ref index);
        }
        // Convert Numbers
        // Two bytes length information for each dimension
        Buffer.BlockCopy(BitConverter.GetBytes((ushort)(Numbers == null ? 0 : Numbers.Count)), 0, bytes, index, 2);
        index += 2;
        foreach(var value in Numbers ?? Enumerable.Empty<ulong>())
        {
            Buffer.BlockCopy(BitConverter.GetBytes(value), 0, bytes, index, 8);;
            index += 8;
        }
        return bytes;
    }
0 голосов
/ 19 марта 2012

Взгляните на protobuf-net . Это отличная библиотека для того, чтобы делать именно то, что вы хотите. Это сторонняя библиотека, однако она хранит данные в четко определенном формате, который могут быть прочитаны другими библиотеками как на C #, так и на многих других языках.

Вот пример того, как его использовать: http://code.google.com/p/protobuf-net/wiki/GettingStarted

Я сам этим пользовался и был очень доволен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...