Обычно реализации коллекции «берут» тип из объявления поля коллекции, а не из данного элемента в List
/ Set
/ и т. Д. Нам нужно написать собственный сериализатор, который для каждого элемента находит сериализатор и использует его. Простая реализация:
class TypeAwareListJsonSeserializer implements JsonSerializer<List<?>> {
@Override
public JsonElement serialize(List<?> src, Type typeOfSrc, JsonSerializationContext context) {
if (src == null) {
return JsonNull.INSTANCE;
}
JsonArray array = new JsonArray();
for (Object item : src) {
JsonElement jsonElement = context.serialize(item, item.getClass());
array.add(jsonElement);
}
return array;
}
}
И вот как мы можем использовать это:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.annotations.JsonAdapter;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;
public class GsonApp {
public static void main(String[] args) throws Exception {
List<BaseBean> children = Arrays.asList(new BaseBean(), new ChildBean(), new ChildBean2());
BaseBeanHolder baseHolder = new BaseBeanHolder(children);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();
System.out.println(gson.toJson(baseHolder));
}
}
class BaseBean {
String baseField = "base";
}
class ChildBean extends BaseBean {
String childField = "child";
}
class ChildBean2 extends BaseBean {
int bean2Int = 356;
}
class BaseBeanHolder {
@JsonAdapter(TypeAwareListJsonSeserializer.class)
private List<? extends BaseBean> beans;
// getters, setters, toString
}
Выше кода печатается:
{
"beans": [
{
"baseField": "base"
},
{
"childField": "child",
"baseField": "base"
},
{
"bean2Int": 356,
"baseField": "base"
}
]
}
Во время сериализации мы теряем информацию о типе, которая потребуется в процессе десериализации. Я разработал информацию простого типа, которая будет храниться во время сериализации и использоваться при десериализации. Это может выглядеть следующим образом:
class TypeAwareListJsonAdapter implements JsonSerializer<List<?>>, JsonDeserializer<List<?>> {
private final String typeProperty = "@type";
@Override
public JsonElement serialize(List<?> src, Type typeOfSrc, JsonSerializationContext context) {
if (src == null) {
return JsonNull.INSTANCE;
}
JsonArray array = new JsonArray();
for (Object item : src) {
JsonObject jsonElement = (JsonObject) context.serialize(item, item.getClass());
jsonElement.addProperty(typeProperty, item.getClass().getSimpleName());
array.add(jsonElement);
}
return array;
}
@Override
public List<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
final Type elementType = $Gson$Types.getCollectionElementType(typeOfT, List.class);
if (json instanceof JsonArray) {
final JsonArray array = (JsonArray) json;
final int size = array.size();
if (size == 0) {
return Collections.emptyList();
}
final List<?> suites = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
JsonObject jsonElement = (JsonObject) array.get(i);
String simpleName = jsonElement.get(typeProperty).getAsString();
suites.add(context.deserialize(jsonElement, getClass(simpleName, elementType)));
}
return suites;
}
return Collections.emptyList();
}
private Type getClass(String simpleName, Type defaultType) {
try {
// you can use mapping or something else...
return Class.forName("com.model." + simpleName);
} catch (ClassNotFoundException e) {
return defaultType;
}
}
}
Самая большая проблема заключается в том, как сопоставить классы значениям JSON
. Мы можем использовать простое имя класса или предоставить Map<String, Class>
и использовать его. Теперь мы можем использовать его, как указано выше. Пример приложения печатается сейчас:
{
"beans": [
{
"baseField": "base",
"@type": "BaseBean"
},
{
"childField": "child",
"baseField": "base",
"@type": "ChildBean"
},
{
"bean2Int": 356,
"baseField": "base",
"@type": "ChildBean2"
}
]
}
BaseBean{baseField='base'}
ChildBean{baseField='base', childField='child'}
ChildBean2{baseField='base', bean2Int=356}
Вы могли попробовать классическую базу данных мира MySQL.
world.sql файл доступен для скачивания здесь:
http://dev.mysql.com/doc/index-other.html
Просто прокрутите вниз к Базам данных В качестве примера, и Вы найдете его.
Проверьте CodePlex для Microsoft SQL Server Community Projects & Samples
Вдобавок к ссылке выше Вас мог бы посмотреть на
Почему бы не загружать английскую Википедию? Существуют сжатые файлы SQL различных размеров, и это должно, конечно, быть достаточно большим для Вас
Основные статьи являются XML, так вставка их в дб является немного большим количеством проблемы, но Вы могли бы найти, что существуют другие файлы там, которые подходят Вам. Например, межстраница связывается, файл SQL составляет сжатых 2.3 ГБ. Взгляните на https://en.wikipedia.org/wiki/Wikipedia:Database_download для большего количества информации.
Oskar
Если Вы хотите, чтобы большая база данных реальных данных играла с, Вы могли бы зарегистрироваться в Соревновании на приз Netflix и получить доступ к их данным, которые являются довольно большими (несколько концертов записей).
URL выше не содержит набор данных anylonger (октябрь 2016). Страница Википедии о Призе Netflix сообщает, что судебный процесс был улажен относительно проблем конфиденциальности.
Вы хотите огромный?
Вот маленькая таблица: создайте нечто таблицы (идентификационный интервал не пустой первичный ключ auto_increment, загаженный символ (2000));
вставьте в нечто (дерьмо) значения ('');
- каждый раз, когда Вы выполняете следующую строку, количество строк в нечто удваивается. вставьте в нечто (дерьмо) выбор * от нечто;
выполните его еще двадцать раз, у Вас есть более чем миллион строк для проигрывания с.
Да, если он ищет взгляды отношений для навигации, это не ответ. Но если огромным он будет значить для проведения испытаний и его способности оптимизировать, то это сделает это. Я сделал точно это (и затем обновил со случайными значениями) протестировать потенциальный ответ, который я имел для другого вопроса. (И не ответил на это, потому что я не мог придумать лучшую производительность, чем, что имел тот автор вопроса.)
Он попросил "комплекс", у меня был бы gien ответом differnt. Мне, "огромный" подразумевает "много строк".
Поскольку Вам не нужно огромный для проигрывания с таблицами и отношениями. Рассмотрите таблицу, отдельно, без nullable столбцов. Сколькими могут там быть различные виды строк? Только один, поскольку все столбцы должны иметь некоторое значение, поскольку ни один не может быть пустым.
Каждый nullable столбец кратные числа два количество различных видов возможных строк: строка, где тот столбец является пустым, строка, где это не является пустым.
Теперь рассмотрите таблицу, не в изоляции. Рассмотрите таблицу, которая является дочерней таблицей: для каждого ребенка, который имеет FK к родителю, что, является many-one, может быть 0, 1 или многие дети. Таким образом, мы умножаемся три раза количеством, мы вошли в предыдущий шаг (никакие строки для нуля, один точно для один, две строки для многих). Для любого прародителя, к которому родитель - многие, еще три.
Для many-many отношений мы можем иметь, не имеют никакого отношения, непосредственного, one-many, many-one, или many-many. Таким образом для каждого many-many мы можем достигнуть в графике от таблицы, мы умножаем строки на девять - или точно так же, как два одна - к manys. Если many-many также имеет данные, мы умножаемся nullability числом.
Таблицы, которых мы не можем достигнуть в нашем графике - те, к которым у нас нет прямого или косвенного FK, не умножайте строки в нашей таблице.
Путем рекурсивного умножения каждой таблицы мы можем достигнуть, мы можем придумать количество строк, должен был обеспечить один из каждого "вида", и нам нужны не больше, чем они для тестирования каждого возможного отношения в нашей схеме. И мы нигде не рядом огромны.