Как исправить повторяющиеся элементы в поле повторяющегося протокола-буфера? - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу загрузить некоторые данные, используя ProtoColl-буферы (JSON был слишком медленным на Android), но каким-то образом мое поле repeated под названием company содержит 6 копий каждого элемента - хотя я не храню любые дубликаты.

Откуда мне знать, что он не должен содержать дубликатов?
Я установил счетчик для каждого сохраняемого объекта - и это была ожидаемая длина.

Это моя схема:

syntax = "proto3";

[...]

message CompanyProtoRepository {
    // THIS FIELD CONTAINS DUPLICATES!
    repeated CompanyProto company = 1;
}

Как я храню свои данные:

 public void writeToFile(String fileName) {
        CompanyProtos.CompanyProtoRepository repo = loadRepository();
        try {
            OutputStream outputStream = mContext.openFileOutput(fileName, Context.MODE_PRIVATE);
            repo.writeTo(outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private CompanyProtos.CompanyProtoRepository loadRepository() {
        CompanyLoaderService jsonLoader = new JsonCompanyLoaderService(mContext.getResources());
        CompanyProtos.CompanyProtoRepositoryOrBuilder repo = CompanyProtos.CompanyProtoRepository.newBuilder();
        int counter = 0; // Will be 175 which is correct (every company 1 time)
        // Will contain every id only time -> correct!
        HashMap<Integer, Integer> map = new HashMap<>();
        for (Company company : jsonLoader.getCompanies()) {
            counter++;
            if (!map.containsKey(company.getName()))
                map.put(company.getId(), 1);
            else
                map.put(company.getId(), map.get(company.getId()) + 1);

            CompanyProtos.CompanyProto proto = toProto(company);
            if (!repo.getCompanyList().contains(proto))
                ((CompanyProtos.CompanyProtoRepository.Builder) repo).addCompany(proto);
        }
        return ((CompanyProtos.CompanyProtoRepository.Builder) repo).build();
    }

И вот как я загружаю свои данные:

 private List<Company> loadCompanies() {
        CompanyProtos.CompanyProtoRepository repo = null;
        try {
            InputStream inputStream = mContext.getResources().openRawResource(R.raw.company_buffers);
            repo = CompanyProtos.CompanyProtoRepository.parseFrom(inputStream);
            ArrayList<Company> list = new ArrayList<>();
            for (CompanyProtos.CompanyProto companyProto: repo.getCompanyList()) {
                list.add(fromProto(companyProto));
            }
            // This list contains every company 6 times!
            return list;
        } catch (Exception ex) { }
    }

Конечно, я ожидал, что каждыйкомпания только 1 раз, так как я проверял, что я храню каждую компанию только раз в моем CompanyProtoRepository вместо 6 раз.

1 Ответ

0 голосов
/ 08 февраля 2019

О, боже мой.
Я просто часами пытался исправить эту ошибку.
Оказывается, я читаю из старого поврежденного набора данных, а не из файла, которым я являюсьна самом деле пишет.

...