На клиенте надо перевести в json один из трех объектво, допустим А, Б, С.
Сервер принимает json-строку и надо ее распарсить в объект, но используя GSON надо конкретно указать класс A a = json.fromJson(parse, A.class);
Какие есть варианты, если неизвестно какой тип придёт на сервер? Есть, конечно, вариант, сделать в каждом классе поле String type = "нужный нам тип класса" и с помощью фабрики и этого типа уже вогнать в нужный тип, но это совсем не выглядит хорошим вариантом. Как это можно сделать еще? Заранее спасибо
B общем случае - никак. Если у классов поля совпадают, их никак не различить, например. А так, написать своей адаптер и, например, перебором пробовать распарсить, до победного.
Денис Загаевский, а, ну даже было наверное разумнее описать полностью проблему. В общем, пишу клиент-серверное приложение на java, простенький мессенджер. Т.к проще всего по совкетам и потокам летает стринги, принял решение нужные данные на сервер и обратно отсылать json-ом,но, естественно, сообщениями одними тут не обойдешься. Ещё надо послать данные для входа и регистрации, соответственно надо на сервере определиться что с полученными данными делать, вот и подумалось мне, что надо как-то так. Если подскажите самое грамотное решение тут, вне зависимости от его сложности, буду очень благодарен, даже если полностью надо будет пересмотреть архитектуру приложения (конечно, архитектура для меня - слишком громко, но все же)
З.ы может я конечно слишком далеко попытался плюнуть, но тут слишком много практических областей м хочу все таки пытаться людскими советами набраться опыта, ещё раз спасибо
Владислав Винокуров, сделай просто аттрибут классу, какой-нибудь Byte classTypeID и делай парсинг основывая на нем. Это удобнее всего. А так можно по сути и по структуре класса различать. Это работает, когда типов не так много, когда их десятки - то уже наделоть ошибок можно легко.
Владислав Винокуров, да на первое время пойдёт и джсон, мне кажется. Поле-тип и свич по нему. Просто сделай нормальную абстракцию от объектов, которые приходят из сети, DTO и всё такое. То есть парсь в одни, а потом сразу перегоняй в другие. Тогда заменить формат будет легко.
В любом случае вариантов как минимум два, или заглядывать вперед в потоке, или заново переоткрывать.
Можно поступить хитрым образом - использовать https://docs.oracle.com/javase/7/docs/api/java/io/... и/или GSON stream API.
В первом случае мы заглядываем в поток на какой-то размер, просматриваем его на наличии нужных нам маркеров, затем делаем unread и уже работаем как нам нужно.