байт [] в строго типизированный массив? - PullRequest
0 голосов
/ 02 марта 2012

У меня возникли проблемы с преобразованием массива byte [] в строго типизированный массив.

  1. У меня есть массив, который был объединен в один большой массив byte [] и сохранен в таблице.
  2. Затем я хочу прочитать этот массив byte [], но преобразовать встрого типизированный массив.

Поскольку я сохранил весь массив как массив byte [], могу ли я прочитать этот байтовый массив и преобразовать его в свою строго типизированную версию? В настоящий момент возвращается ноль ...

Возможно ли это одним ударом?

Заранее спасибо, Онам.

<code>
    #region Save
    public void Save<T>(T[] Array) where T : new()
    {
        List<byte[]> _ByteCollection = new List<byte[]>();
        byte[] _Bytes = null;
        int _Length = 0;
        int _Offset = 0;

        foreach (T _Item in Array)
        {
            _ByteCollection.Add(Serialise(_Item));
        }
        foreach (byte[] _Byte in _ByteCollection)
        {
            _Length += _Byte.Length;
        }

        _Bytes = new byte[_Length];

        foreach (byte[] b in _ByteCollection)
        {
            System.Buffer.BlockCopy(b, 0, _Bytes, _Offset, b.Length);
            _Offset += b.Length;
        }
        Customer[] c = BinaryDeserialize<Customer[]>(_Bytes);
    }
    #endregion

    #region BinaryDeserialize
    public static T BinaryDeserialize<T>(byte[] RawData)
    {
        T _DeserializedContent = default(T);

        BinaryFormatter _Formatter = new BinaryFormatter();
        try
        {
            using (MemoryStream _Stream = new MemoryStream())
            {
                _Stream.Write(RawData, 0, RawData.Length);
                _Stream.Seek(0, SeekOrigin.Begin);
                _DeserializedContent = (T)_Formatter.Deserialize(_Stream);
            }
        }
        catch (Exception ex)
        {
            _DeserializedContent = default(T);
        }

        return _DeserializedContent;
    }
    #endregion
</code>

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Мне кажется, проблема в том, что вы сериализуете каждый элемент в список, а затем объединяете байты.Когда это десериализовано, это выглядит как данные для одного клиента плюс некоторые неожиданные данные (для других клиентов) в конце.

Я не знаю, как работает ваш метод сериализации, но вы, вероятно, можете просто изменить код:

    foreach (T _Item in Array)
    {
        _ByteCollection.Add(Serialise(_Item));
    }

Кому:

_ByteCollection.Add(Serialise(Array));

И это должно сработать, тогда, возможно, вы могли бы немного упростить его.

0 голосов
/ 02 марта 2012

Скорее всего, строка

_DeserializedContent = (T)_Formatter.Deserialize(_Stream);

выдает исключение.В блоке catch вы просто глотаете и игнорируете это исключение.

...