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

Я хочу загрузить некоторые данные, используя протокольные буферы (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 раз.


person user3185698    schedule 07.02.2019    source источник


Ответы (1)


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

person user3185698    schedule 07.02.2019