Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как разделить 2 потока MemoryStream

53K
26 марта 2010 года
Sc@r@bey
7 / / 06.12.2009
Всем привет. Наткнулся недавно на проблемку по следующему коду:
Код:
public static class Serialization
    {
        public static byte[] Serialize(Object obj)
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                binaryFormatter.Serialize(memoryStream, obj);
                return memoryStream.ToArray();
            }
        }
       public static object Deserialize(byte[] byteArray)
        {
            using (MemoryStream memoryStream = new MemoryStream(byteArray))
            {
                 BinaryFormatter binaryFormatter = new BinaryFormatter();
                 memoryStream.Position = 0;
                 return binaryFormatter.Deserialize(memoryStream);              
            }
        }

Выражается она в том что Deserialize не может работать отдельно от Serialize. То есть я могу спокойно воспользоваться сериализацией, а затем сериализируемые данные соответственно дессериализовать. Но когда я пытаюсь сразу дессериализвать уже готовые данные (заранее сериализованные, например на другом компе), то выходит ошибка:
Буфер не может быть неопределенным
или если решаю эту ошибку то выходит:
Попытка десериализации пустого потока
Есть мысли?:(
5
26 марта 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Sc@r@bey
когда я пытаюсь сразу дессериализвать уже готовые данные (заранее сериализованные, например на другом компе), то выходит ошибка:
Буфер не может быть неопределенным
или если решаю эту ошибку то выходит:
Попытка десериализации пустого потока
Есть мысли?:(


1) Данные сохранены некорректно.
2) Данные прочитаны некорректно.
3) Комбинация 1) и 2).

53K
26 марта 2010 года
Sc@r@bey
7 / / 06.12.2009
Цитата: hardcase
1) Данные сохранены некорректно.
2) Данные прочитаны некорректно.
3) Комбинация 1) и 2).


Данные после сериализации сохранены корректно, их же в первую очередь проверял. А чтение по идее тоже правильно, ведь вызов их происходит также как и при работе программы в которой десериализаяция сразу выполняется после сериализации, т.е. на одной машине.

5
26 марта 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Sc@r@bey
Данные после сериализации сохранены корректно, их же в первую очередь проверял. А чтение по идее тоже правильно, ведь вызов их происходит также как и при работе программы в которой десериализаяция сразу выполняется после сериализации, т.е. на одной машине.


Чудес не бывает. Показывайте код сохранения и код загрузки данных, без него теряется предмет беседы.

53K
26 марта 2010 года
Sc@r@bey
7 / / 06.12.2009
Цитата: hardcase
Чудес не бывает. Показывайте код сохранения и код загрузки данных, без него теряется предмет беседы.



Сериализация:
private void btnSerialize_Click(object sender, EventArgs e)
{

TestClass testClass = new TestClass(this.textBoxIn.Text, Convert.ToInt32(this.numericUpDownIn.Value), Convert.ToInt32(this.numericUpDownIn2.Value));
this.btnDeserialize.Enabled = true;
array = Serialization.Serialize(testClass);
String str = string.Empty;
str = Convert.ToBase64String(array);
textBoxByte.Text = str;

}
Десериализация:
private void btnDeserialize_Click(object sender, EventArgs e)
{
TestClass testClass = Serialization.Deserialize(array) as TestClass;
this.textBoxOut.Text = testClass.TextSerialize;
this.textBoxIntOut.Text = testClass.ValueSerialize.ToString();
this.textBoxIntOut2.Text = testClass.ValueSerialize2.ToString();
}

5
26 марта 2010 года
hardcase
4.5K / / 09.08.2005
Откуда приходит и куда уходит значение в поле array ?
341
26 марта 2010 года
Der Meister
874 / / 21.12.2007
Как передаёте данные между машинами?
53K
26 марта 2010 года
Sc@r@bey
7 / / 06.12.2009
Цитата: hardcase
Откуда приходит и куда уходит значение в поле array ?


array = Serialization.Serialize(testClass); Ты про testClass? array просто массив байтовый.

53K
26 марта 2010 года
Sc@r@bey
7 / / 06.12.2009
Цитата: Der Meister
Как передаёте данные между машинами?


Отправка(но тут не все, так основное):
str = Convert.ToBase64String(array);
Object objData = str;
byte[] byData = Encoding.ASCII.GetBytes(objData.ToString());
for (int i = 0; i < m_clientCount; i++)
{
if (m_workerSocket != null)
{
if (m_workerSocket.Connected)
{
m_workerSocket.Send(byData);
}
}
}
Принятие:
SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
int iRx = theSockId.thisSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
System.String szData = new System.String(chars);
richTextRxMessage.Text = richTextRxMessage.Text + szData;
tmp = richTextRxMessage.Text;
array = Convert.FromBase64String(tmp);

5
26 марта 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Sc@r@bey

byte[] byData = Encoding.ASCII.GetBytes(objData.ToString());

System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();


Символы отправляются в ASCII кодировке а читаются почему-то в UTF8.

53K
26 марта 2010 года
Sc@r@bey
7 / / 06.12.2009
Цитата: hardcase
Символы отправляются в ASCII кодировке а читаются почему-то в UTF8.


Передаваемые данные совершенно аналогичные до бита. Уж не помню почему так сделал, но проблема не в этом.:(

341
26 марта 2010 года
Der Meister
874 / / 21.12.2007
А почему не хотя бы так (простите за мой третий сешарп)?
Код:
namespace Shared
{
    [Serializable]
    public class TestObject
    {
        public readonly string _string_value;
        public readonly int _int_value;

        public TestObject(string string_value, int int_value)
        {
            _string_value = string_value;
            _int_value = int_value;
        }

        public override string ToString()
        {
            return string.Format(
                "_string_value = \"{0}\" _int_value = {1}",
                _string_value,
                _int_value
            );
        }
    }
}

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            var @object = new TestObject("Test", 2010);
            using (var client = new TcpClient("server_host_name", 4029))
            using (var stream = client.GetStream())
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(stream, @object);
            }
        }
    }
}

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            var listener = new TcpListener(IPAddress.Loopback, 4029);
            listener.Start();
            try
            {
                while (true)
                {
                    var client = listener.AcceptTcpClient();
                    ThreadPool.QueueUserWorkItem(state_info => OnAcceptClient(client));
                }
            }
            finally
            {
                listener.Stop();
            }
        }

        static void OnAcceptClient(TcpClient client)
        {
            using (client)
            using (var stream = client.GetStream())
            {
                var formatter = new BinaryFormatter();
                var @object = (TestObject) formatter.Deserialize(stream);

                // Already syncronized
                Console.WriteLine(@object);
            }
        }
    }
}
Ведь всё же "Буфер не может быть неопределенным" и "Попытка десериализации пустого потока" какбэ намекают нам...
53K
26 марта 2010 года
Sc@r@bey
7 / / 06.12.2009
Цитата: Der Meister
А почему не хотя бы так (простите за мой третий сешарп)?
Ведь всё же "Буфер не может быть неопределенным" и "Попытка десериализации пустого потока" какбэ намекают нам...


Эх придется переделывать всю сериализацию. Спасибо, буду дальше делать. Но если у кого нидь есть еще предложения я ЗА :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог