Мне понравился метод Lost Koder. Я столкнулся с проблемами при попытке сериализации более сложных объектов, чьи члены / методы не сериализуемы. Вот моя реализация, которая работает с большим количеством объектов:
class Serializer(object):
@staticmethod
def serialize(obj):
def check(o):
for k, v in o.__dict__.items():
try:
_ = json.dumps(v)
o.__dict__[k] = v
except TypeError:
o.__dict__[k] = str(v)
return o
return json.dumps(check(obj).__dict__, indent=2)
Когда я должен был записать приложение с клиент-серверной моделью, где клиенты могли уехать и войти каждый раз, когда они хотят, (я предполагаю, что это также имеет место для Вашего приложения, поскольку Вы используете мобильные устройства), я удостоверился, что клиенты отправляют онлайн сообщение к серверу, указывая, что они были соединены и готовы сделать независимо от того, что им было нужно выполнение.
в то время сервер мог передать сообщения обратно клиентской канавке то же открытое соединение.
кроме того, но я не знаю, применимо ли это для Вас, у меня был своего рода heartbeat клиенты, отправленные на сервер, позволяя ему знать, что это все еще было онлайн. Тем путем сервер знает, когда клиент был насильственно разъединен от сети, и это могло отметить тот клиент назад как офлайн.
Используя асинхронную передачу полностью возможно в единственном потоке!
существует шаблон общего умысла в разработке сетевого программного обеспечения, названной реакторным шаблоном ( взгляд на эту книгу ). Некоторая известная сетевая библиотека обеспечивает реализацию этого шаблона ( взгляд на ACE).
Кратко, реактор является объектом, Вы регистрируете все свои сокеты внутри, и Вы ожидаете чего-то. Если что-то произошло (новые данные прибыли, соединение близко...), реактор уведомит Вас. И конечно, можно использовать только один сокет для отправки и полученные данные асинхронно.
Я не ясен на том, желаете ли Вы добавить асинхронные биты к серверу в C# или клиенту в C++.
, Если Вы говорите о выполнении этого в C++, настольные платформы Windows могут сделать, ввод-вывод сокета асинхронно посредством того использования API перекрыл ввод-вывод. Для сокетов, WSASend, WSARecv оба позволяют асинхронный ввод-вывод (прочитайте документацию относительно их параметров LPOVERLAPPED, которые можно заполнить с событиями, которые установлены, когда ввод-вывод завершается).
я не знаю, поддерживают ли платформы Windows Mobile эти функции, таким образом, Вам, возможно, придется сделать некоторое дополнительное рытье.
Выезд asio. Это - перекрестная совместимая библиотека C++ для асинхронного IO. Я не уверен, было ли это полезно для сервера (я никогда не пытался связать стандартный DLL C++ с c# проектом), но для клиента это было бы полезно.
Мы используем его с нашим приложением, и это решило большинство наших проблем параллелизма IO.