2013-05-06 3 views
2

Это сводит меня с ума прямо сейчас, я в настоящее время пишу некоторые программы клиент/сервер, я могу послать массивы между клиентами без проблем, но проблема заключается в этом коде здесь:Serialize класса

MemoryStream fs = new MemoryStream(); 
BinaryFormatter formatter = new BinaryFormatter(); 
lock (fs) 
     lock (sharedVars.clients[i]) 
      formatter.Serialize(fs, sharedVars.clients[i]); 
    sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray())); 

Я запускаю код и с точками останова. Я вижу, что memystream содержит данные в нем из сериализации, однако он никогда не попадает на другой компьютер (это фактически происходит через локальный хост, чтобы избежать фактических ошибок сетевого оборудования).

Это используется TCP, и настоящая сумасшедшая часть заключается в том, что если я вручную напишу новый массив байтов в память, то данные попадут на другую сторону без проблем, по сути, это просто не похоже на сериализованные данные. Это меня действительно запутывает, поэтому я задаю вопрос обществу, какие-то идеи?

Для дополнительной ссылки это то, что дозвонились, когда совершенно пустой массив (преградить request_rtn байт в начале) попадает в другой конец:

Shared.SharedValues.Client clientTemp; 

readBuffer = removeFirstByte(readBuffer); 

BinaryFormatter formatter = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(readBuffer); 

ms.Position = 0; 

lock (serverValues) 
    clientTemp = (Shared.SharedValues.Client)formatter.Deserialize(ms); 

serverValues.clients[clientTemp.ID] = clientTemp; 

И снова на стороне сервера код я изменил проверить это, который работает во всех отношениях:

MemoryStream fs = new MemoryStream(); 
BinaryFormatter formatter = new BinaryFormatter(); 

byte[] byteArray = new byte[10000]; 

for (i = 0; i < 10000; i++) 
{ 
    byteArray[i] = (byte)i; 
} 

lock (fs) 
    lock (sharedVars.clients[i]) 
     //formatter.Serialize(fs, sharedVars.clients[i]); 
     fs.Write(byteArray, 0, 10000); 
    sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray())); 
+0

Вы проверили содержимое fs.toArray()? –

+0

В обоих случаях они содержат именно то, что я ожидаю. –

+0

Как клиент, так и сервер используют одно и то же определение класса для 'Shared.SharedValues.Client'? – rsbarro

ответ

1

После долгих поигрывая вокруг меня кончались фиксируя проблему, просто писать буфер его самостоятельно с помощью:

fs.Write(fs.GetBuffer(), 0, fs.Capacity); 

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

Лом этот, оказывается, что строка выше ничего не помогает, истинная ошибка заключается в том, что я делал асинхронную запись, и почти сразу буферы, которые были записаны в сеть, уничтожались, это по существу означает что 1 или 2 байта пройдут, а затем нагрузка 0. Поэтому для тех, кто сталкивается с этой проблемой в будущем, убедитесь, что вы не делаете что-то глупое, как я.

Благодарим вас за запросов, которые некоторые из вас сделали, пытаясь выяснить, что происходит.

Смежные вопросы