猿问

如何修复重复的协议缓冲区字段中的重复元素?

我想使用 protocoll-buffers 加载一些数据(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();

    }


当然,我希望每家公司只有 1 次,因为我确认每家公司只存储一次CompanyProtoRepository而不是 6 次。


杨魅力
浏览 118回答 1
1回答

慕少森

哦,我的他妈的上帝。我只是花了几个小时试图修复那个错误。原来我正在读取一个旧的损坏数据集 - 而不是我实际写入的文件。
随时随地看视频慕课网APP

相关分类

Java
我要回答