Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > BitArray сериализуемый в число (long)


Автор: anls 26.7.2011, 15:23
Здравствуйте.

Задача следующая:

Необходимо Сделать отдельный битовый класс сериализуемый в число (long).

Как это можно сделать?

Автор: mr.DUDA 27.7.2011, 11:15
Вариант: завернуть BitVector в свой класс/структуру, сериализуемую через ISerializable. Выставить наружу нужные методы/свойства BitVector-а.

Другой вариант - написать свой аналог битвектора, там всё достаточно тривиально делается если тип данных известен.

Автор: anls 27.7.2011, 16:45
Цитата(mr.DUDA @ 27.7.2011,  11:15)
Вариант: завернуть BitVector в свой класс/структуру, сериализуемую через ISerializable. Выставить наружу нужные методы/свойства BitVector-а.

Другой вариант - написать свой аналог битвектора, там всё достаточно тривиально делается если тип данных известен.

А есть пример кода, сталкиваюсь с этим в первый раз.

Автор: mr.DUDA 27.7.2011, 18:57
Можно так:
Код
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

[Serializable]
public class BitArray
{
    long value_;

    public BitArray() { }

    public bool this[int bitIndex]
    {
        get { return ((value_ >> bitIndex) & 1) == 1; }
        set
        {
            if (value)
                value_ |= 1L << bitIndex;
            else
                value_ &= ~(1L << bitIndex);
        }
    }

    public override string ToString()
    {
        string ret = "";
        for (int i = 63; i >= 0; i--)
            ret += (this[i] ? '1' : '0');
        return ret;
    }
}

class Program
{
    public static void Main()
    {
        BitArray arr = new BitArray();
        Console.WriteLine(arr);

        arr[63] = true;
        Console.WriteLine(arr);

        arr[2] = true;
        Console.WriteLine(arr);

        arr[2] = false;
        Console.WriteLine(arr);

        arr[4] = true;
        arr[16] = true;

        var stream = new MemoryStream();
        var fmt = new BinaryFormatter();
        fmt.Serialize(stream, arr);
    }
}


Единственное, если понадобится потом десериализовать поток в обычный long - не получится т.к. вместе с данными сериализуется и информация о классе.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)