Как разделить 2 потока MemoryStream
{
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. То есть я могу спокойно воспользоваться сериализацией, а затем сериализируемые данные соответственно дессериализовать. Но когда я пытаюсь сразу дессериализвать уже готовые данные (заранее сериализованные, например на другом компе), то выходит ошибка:
Буфер не может быть неопределенным
или если решаю эту ошибку то выходит:
Попытка десериализации пустого потока
Есть мысли?:(
Буфер не может быть неопределенным
или если решаю эту ошибку то выходит:
Попытка десериализации пустого потока
Есть мысли?:(
1) Данные сохранены некорректно.
2) Данные прочитаны некорректно.
3) Комбинация 1) и 2).
2) Данные прочитаны некорректно.
3) Комбинация 1) и 2).
Данные после сериализации сохранены корректно, их же в первую очередь проверял. А чтение по идее тоже правильно, ведь вызов их происходит также как и при работе программы в которой десериализаяция сразу выполняется после сериализации, т.е. на одной машине.
Чудес не бывает. Показывайте код сохранения и код загрузки данных, без него теряется предмет беседы.
Сериализация:
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();
}
array = Serialization.Serialize(testClass); Ты про testClass? array просто массив байтовый.
Отправка(но тут не все, так основное):
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);
byte[] byData = Encoding.ASCII.GetBytes(objData.ToString());
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
Символы отправляются в ASCII кодировке а читаются почему-то в UTF8.
Передаваемые данные совершенно аналогичные до бита. Уж не помню почему так сделал, но проблема не в этом.:(
{
[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);
}
}
}
}
Ведь всё же "Буфер не может быть неопределенным" и "Попытка десериализации пустого потока" какбэ намекают нам...
Эх придется переделывать всю сериализацию. Спасибо, буду дальше делать. Но если у кого нидь есть еще предложения я ЗА :)