База данных-образец для [закрытого] осуществления

Обычно реализации коллекции «берут» тип из объявления поля коллекции, а не из данного элемента в 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}
47
задан n00ki3 22 April 2010 в 19:25
поделиться

5 ответов

Вы могли попробовать классическую базу данных мира MySQL.

world.sql файл доступен для скачивания здесь:

http://dev.mysql.com/doc/index-other.html

Просто прокрутите вниз к Базам данных В качестве примера, и Вы найдете его.

38
ответ дан Idolon 26 November 2019 в 19:54
поделиться

Проверьте CodePlex для Microsoft SQL Server Community Projects & Samples

Стороннее редактирование

Вдобавок к ссылке выше Вас мог бы посмотреть на

4
ответ дан surfmuggle 26 November 2019 в 19:54
поделиться

Почему бы не загружать английскую Википедию? Существуют сжатые файлы SQL различных размеров, и это должно, конечно, быть достаточно большим для Вас

Основные статьи являются XML, так вставка их в дб является немного большим количеством проблемы, но Вы могли бы найти, что существуют другие файлы там, которые подходят Вам. Например, межстраница связывается, файл SQL составляет сжатых 2.3 ГБ. Взгляните на https://en.wikipedia.org/wiki/Wikipedia:Database_download для большего количества информации.

Oskar

3
ответ дан simhumileco 26 November 2019 в 19:54
поделиться

Если Вы хотите, чтобы большая база данных реальных данных играла с, Вы могли бы зарегистрироваться в Соревновании на приз Netflix и получить доступ к их данным, которые являются довольно большими (несколько концертов записей).

Стороннее редактирование

URL выше не содержит набор данных anylonger (октябрь 2016). Страница Википедии о Призе Netflix сообщает, что судебный процесс был улажен относительно проблем конфиденциальности.

1
ответ дан surfmuggle 26 November 2019 в 19:54
поделиться

Вы хотите огромный?

Вот маленькая таблица: создайте нечто таблицы (идентификационный интервал не пустой первичный ключ 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, не умножайте строки в нашей таблице.

Путем рекурсивного умножения каждой таблицы мы можем достигнуть, мы можем придумать количество строк, должен был обеспечить один из каждого "вида", и нам нужны не больше, чем они для тестирования каждого возможного отношения в нашей схеме. И мы нигде не рядом огромны.

-6
ответ дан tpdi 26 November 2019 в 19:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: