C # BinaryFormatter.deserialize в объект для отправки через сокеты

У меня есть клиент, который сериализует класс в поток, который проходит через сокет на мой сервер. Итак, я отправляю этот объект на свой сервер, где мой сервер сохранит объект, выполнив:

object readObject = formatter.Deserialize(stream);

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

Означает ли это, что у моего сервера нет возможности взять объект, протолкнуть его через еще несколько сокетов другим клиентам, где клиенты десериализуют его? Действительно ли серверу требуется исходный класс для десериализации объекта?

Я не хочу, чтобы мой сервер вообще мог открывать все эти объекты, я просто хочу, чтобы он обслуживал всех моих активных клиентов.

Помощь приветствуется, Смайлик


person Smileynator    schedule 09.07.2013    source источник
comment
Действительно ли серверу требуется исходный класс для десериализации объекта? Гм, да. Как вы думаете, какой тип объекта он создаст в противном случае?   -  person Jon Skeet    schedule 09.07.2013
comment
Я думал, что объект - это своего рода анонимное хранилище. например, это может быть ЛЮБОЙ объект, пока вы не решите применить его к чему-либо. Но, видимо, тогда этого не произойдет?   -  person Smileynator    schedule 09.07.2013
comment
Нет, объект абсолютно не просто анонимное хранилище. Скажем так - чего бы вы ожидали, если бы вы вызывали GetType() в результате десериализации?   -  person Jon Skeet    schedule 09.07.2013
comment
Я ожидаю, что он будет знать тип / имя объекта внутри, но не сможет преобразовать его в этот тип, потому что он не знает, как он создается.   -  person Smileynator    schedule 09.07.2013
comment
Если вам не нужно, чтобы сервер действительно обрабатывал данные как объекты, почему бы просто не сохранить их как необработанные двоичные данные и не передать их клиентам?   -  person Jon Skeet    schedule 09.07.2013
comment
Если бы я знал, как правильно это сделать, я бы с радостью узнал, потому что это все, что нужно сделать. но я понятия не имею, как правильно читать поток, чтобы сделать это, и не испортить. (поскольку я буду отправлять объекты разного размера, причем несколько раз подряд через один и тот же сокет)   -  person Smileynator    schedule 09.07.2013
comment
По сути, вы должны указывать длину каждого сообщения перед каждым сообщением. Итак, это (длина, данные), (длина, данные) и т. Д.   -  person Jon Skeet    schedule 09.07.2013
comment
хм, плохо гуглить, что тогда отдельно. Однако я надеялся избежать этого метода. Спасибо   -  person Smileynator    schedule 09.07.2013


Ответы (2)


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

person Michael Bray    schedule 09.07.2013

Например, посмотрите код TCPMessageServer, доступный с открытым исходным кодом из codeplex

https://tcpmessageserver.codeplex.com/

person s1cart3r    schedule 09.07.2013