如何将EMF对象持久化到OutputStream?



我将两个EMF对象(静态shelf和动态md5)保存到压缩的二进制文件中:

static void save(Shelf shelf, String file, EClass md5class) throws Exception { 
EObject md5 = stringToMD5EObject("0x0abc", md5class); 
Resource resource = createResource(file, md5class.getEPackage(), shelf.eClass().getEPackage());
resource.getContents().add(md5); 
resource.getContents().add(shelf); 
resource.save(options());
}
static Resource createResource(String file, EPackage... packages) {
ResourceSet resourceSet = new ResourceSetImpl();
Resource.Factory factory = uri -> new BinaryResourceImpl(uri);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("bin", factory); 
for (EPackage p : packages) resourceSet.getPackageRegistry().put(p.getNsURI(), p);
URI fileURI = URI.createFileURI(new File(file).getAbsolutePath());
return resourceSet.createResource(fileURI);
}
static Map<String, Object> options() {
return Collections.singletonMap(BinaryResourceImpl.OPTION_ZIP, Boolean.TRUE);
}

问题是如何配置资源,如果我给一个已经打开OutputStream,那是没有访问任何文件名?

这里有一个解决方案供将来参考:

static {
options = Collections.singletonMap(BinaryResourceImpl.OPTION_ZIP, true);
}
public void save(OutputStream outputStream, EObject ... eObject) throws Exception {
Resource resource = createResource(Arrays.stream(eObject).map(x -> x.eClass().getEPackage()));
Arrays.stream(eObject).forEach(resource.getContents()::add);
resource.save(outputStream, options);
}
public EList<EObject> load(InputStream inputStream, EPackage ... packages) throws Exception {
Resource resource = createResource(Arrays.stream(packages));
resource.load(inputStream, options);
return resource.getContents();
}

private Resource createResource(Stream<EPackage> packages) {
ResourceSet resourceSet = new ResourceSetImpl();
Resource.Factory resourceFactory = __ -> new BinaryResourceImpl();
resourceSet.getResourceFactoryRegistry().getContentTypeToFactoryMap().put("*", resourceFactory);
packages.forEach(p -> resourceSet.getPackageRegistry().put(p.getNsURI(), p));
return resourceSet.createResource(null);
}

最新更新