当前位置: 首页 > 面试题库 >

将原始二进制数据与XML一起存储的最标准Java方法是什么?

融烨华
2023-03-14
问题内容

我需要将大量的二进制数据存储到文件中,但是我还想以XML格式读取/写入该文件的标头。

是的,我可以将二进制数据存储到一些XML值中,并使用base64编码对其进行序列化。 但这不会节省空间。

是否可以以某种或多或少的标准化方式“混合” XML数据和原始二进制数据?

我在考虑两种选择:

  • 有没有办法使用JAXB做到这一点?

  • 还是有办法获取现有的XML数据并向其附加二进制数据,从而可以识别边界?

  • 我要寻找的概念不是以某种方式用于SOAP吗?

  • 还是在电子邮件标准中使用了它? (分离二进制附件)

我要实现的方案:

[meta-info-about-boundary][XML-data][boundary][raw-binary-data]

谢谢!


问题答案:

我遵循 Blaise Doughan 提出的概念,但没有依恋的编组:

我让a
XmlAdapter转换byte[]URI-reference并返回,而引用则指向存储原始数据的单独文件。然后将XML文件和所有二进制文件放入一个zip文件中。

它类似于OpenOffice和ODF格式的方法,实际上是一个很少包含XML和二进制文件的zip。

(在示例代码中,没有写入任何实际的二进制文件,也没有创建zip。)

绑定文件

import java.net.*;
import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.*;

final class Bindings {

  static final String SCHEME = "storage";
  static final Class<?>[] ALL_CLASSES = new Class<?>[]{
    Root.class, RawRef.class
  };

  static final class RawRepository
      extends XmlAdapter<URI, byte[]> {

    final SortedMap<String, byte[]> map = new TreeMap<>();
    final String host;
    private int lastID = 0;

    RawRepository(String host) {
      this.host = host;
    }

    @Override
    public byte[] unmarshal(URI o) {
      if (!SCHEME.equals(o.getScheme())) {
        throw new Error("scheme is: " + o.getScheme()
            + ", while expected was: " + SCHEME);
      } else if (!host.equals(o.getHost())) {
        throw new Error("host is: " + o.getHost()
            + ", while expected was: " + host);
      }

      String key = o.getPath();
      if (!map.containsKey(key)) {
        throw new Error("key not found: " + key);
      }

      byte[] ret = map.get(key);
      return Arrays.copyOf(ret, ret.length);
    }

    @Override
    public URI marshal(byte[] o) {
      ++lastID;
      String key = String.valueOf(lastID);
      map.put(key, Arrays.copyOf(o, o.length));

      try {
        return new URI(SCHEME, host, "/" + key, null);
      } catch (URISyntaxException ex) {
        throw new Error(ex);
      }
    }

  }

  @XmlRootElement
  @XmlType
  static final class Root {

    @XmlElement
    final List<RawRef> element = new LinkedList<>();
  }

  @XmlType
  static final class RawRef {

    @XmlJavaTypeAdapter(RawRepository.class)
    @XmlElement
    byte[] raw = null;
  }

}

Main.java

import java.io.*;
import javax.xml.bind.*;

public class _Run {

  public static void main(String[] args)
      throws Exception {
    JAXBContext context = JAXBContext.newInstance(Bindings.ALL_CLASSES);
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    Unmarshaller unmarshaller = context.createUnmarshaller();

    Bindings.RawRepository adapter = new Bindings.RawRepository("myZipVFS");
    marshaller.setAdapter(adapter);

    Bindings.RawRef ta1 = new Bindings.RawRef();
    ta1.raw = "THIS IS A STRING".getBytes();
    Bindings.RawRef ta2 = new Bindings.RawRef();
    ta2.raw = "THIS IS AN OTHER STRING".getBytes();

    Bindings.Root root = new Bindings.Root();
    root.element.add(ta1);
    root.element.add(ta2);

    StringWriter out = new StringWriter();
    marshaller.marshal(root, out);

    System.out.println(out.toString());
  }

}

输出量

<root>
    <element>
        <raw>storage://myZipVFS/1</raw>
    </element>
    <element>
        <raw>storage://myZipVFS/2</raw>
    </element>
</root>


 类似资料:
  • 问题内容: 我们正在捕获大小可变(从100k到800k)的原始二进制字符串,并且我们想存储这些单独的字符串。它们不需要索引(duh),并且不会对该字段的内容进行任何查询。 这些插件的数量将非常大(用于存档),例如每天10,000。像这样的大型二进制字符串的最佳字段类型是什么?应该是还是其他? 问题答案: 就 PostgreSQL 而言,类型是不可能的。与目标相比,它更慢,占用更多空间并且更容易出错

  • 我有一个存储库层,有许多方法组合,以匹配搜索标准…重用这个标准的最佳方法是什么?我认为像FindByNameAndidandBirthdayandAccouncAnumber这样的方法名称不是一个好主意!谢了! }

  • 问题内容: 我有两个用Java编写的应用程序,它们通过网络使用XML消息相互通信。我在接收端使用了SAX解析器,以从消息中获取数据。要求之一是将二进制数据嵌入XML消息中,但是SAX不喜欢这样。有谁知道如何做到这一点? 问题答案: XML是如此多才多艺… XML就像暴力-如果它不能解决问题,则说明你使用的不够多。 编辑: 顺便说一句:Base64 + CDATA可能是最好的解决方案

  • 本文向大家介绍什么是数据标准化,为什么要进行数据标准化?相关面试题,主要包含被问及什么是数据标准化,为什么要进行数据标准化?时的应答技巧和注意事项,需要的朋友参考一下 数据标准化是预处理步骤,将数据标准化到一个特定的范围能够在反向传播中保证更好的收敛。一般来说,是将该值将去平均值后再除以标准差。如果不进行数据标准化,有些特征(值很大)将会对损失函数影响更大(就算这个特别大的特征只是改变了1%,但是

  • 本文向大家介绍对numpy中二进制格式的数据存储与读取方法详解,包括了对numpy中二进制格式的数据存储与读取方法详解的使用技巧和注意事项,需要的朋友参考一下 使用save可以实现对numpy数据的磁盘存储,存储的方式是二进制。查看使用说明,说明专门提到了是未经压缩的二进制形式。存储后的数据可以进行加载或者读取,通过使用load方法。 通过以上操作,数据data1被存储到了demo文件中,nump

  • 问题内容: 已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我有一些想法,随着时间的推移我已经积累了一些想法,但是我真的很想知道是什么使您在对数据库建模时使事情顺利进行: 表名称与主键名称和描述键匹配 模式按功能区域划分 尽可能避免使用复合主键(使用唯一约束) 骆驼案例表名称和字段名称 不要在表前加上tbl_前缀,也不要在proc时加上SP_(无匈