2008-12-15 60 views
3

使用Java,我需要对地址<字符串,字符串>进行编码以存储到字符串中,并且能够再次对其进行解码。这些将被存储在数据库列中,并且可能通常很短并且简单,所以常见情况应该产生一个简单的好看的线,但是不应该破坏数据,即使它包含意外字符等等。Java中字符串转换的简单属性

你怎么会选择做这样的:

  • ,编码形式是单一的,易读行
  • 它不需要大的一个图书馆或太多背景编码/解码
  • 任何定界符正确地逃脱了

Url编码? JSON?自己做?请指定您使用的任何助手库或方法。

(编辑为要求指定更多的环境和需求。)

回答

0

的问题,将有助于一些额外的上下文。

如果您打算在整个地图粒度进行编码和解码,为什么不使用XML?

3

为什么不只是使用Properties class?这正是你想要的。

+0

好主意,但你的链接指向Javadoc索引(我一直这样做,该死的框架......)。你想这个:http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html – 2008-12-15 23:24:44

+0

感谢您的建议,但是我正在寻找的东西,编码到一个单一的行。 – 2008-12-15 23:40:50

+0

为什么一条线很重要?如果你真的想要它作为一个单一的行,你可以使用属性,然后URL/Base64/Something将其编码成一个长字符串... Hacky,但将工作 – Martin 2008-12-16 00:30:22

5

正如@Uri所说,额外的上下文会很好。我认为你的主要担忧不在于特定的编码方案,因为对于大多数编码来说,自己编码对于简单的Map<String, String>来说非常容易。

一个有趣的问题是:这个中间字符串编码将用于什么?

  • ,如果是纯粹的内部,一个特设的格式是细如简单的串联:

    key1|value1|key2|value2 
    
  • 如果人类看到很晚,像Ruby的映射声明的格式是好的:

    { first_key => first_value, 
        second_key => second_value } 
    
  • 如果编码是通过线路发送序列化的映射到另一个应用程序,XML建议很有意义,因为它的标准和合理的自我记录,代价是XML的冗长。

    <map> 
        <entry key='foo' value='bar'/> 
        <entry key='this' value='that'/> 
    </map> 
    
  • 如果地图会刷新到文件,并通过另一个Java应用软件读回后,Properties class的@Cletus'的建议是一个很好的,并具有容易打开额外的好处和由人类进行检查。


编辑:你补充说,这是在数据库中列来存储信息 - 有没有理由使用一列,就像而非三列这样:

CREATE TABLE StringMaps 
(
    map_id NUMBER NOT NULL, -- ditch this if you only store one map... 
    key VARCHAR2 NOT NULL, 
    value VARCHAR2 
); 

除了让您存储更多具有语义意义的数据之外,这可以更正式地将编码/解码移动到数据访问层,并允许其他数据库读取器轻松查看数据,而无需了解您可能使用的任何自定义编码方案。如果您愿意,您还可以通过键或值轻松查询。


再次编辑:你说,它确实需要适应单个列,在这种情况下,我可以:

  • 使用第一管分离编码(或者你喜欢的任何奇特的字符,也许是一些不可打印的英文unicode字符)。最简单的工作。或者...

  • 如果您使用像Oracle这样将数据库识别为真实类型的数据库(并且可以为您提供XPath评估等),并且需要能够很好地读取数据数据库层,使用XML。编写用于解码的XML解析器从来没有趣味,但对于这样一个简单的模式不应该太痛苦。

即使你的数据库不支持XML本身,你可以把它变成任何旧文字状的塔型...

1

我一直在考虑选择一个共同的类似需求通过门面模式表示我的客户端和服务器之间的对话(传输内容)。我想要一个标准化,人性化(简洁),强大,快速的表示。我希望它能够轻量级地实现和运行,易于测试,并且易于“包装”。请注意,我已经按照我的定义和明确的意图消除了XML。通过“wrap”,我的意思是我想支持其他传输内容表示,例如XML,SOAP,可能的Java属性或Windows INI格式,逗号分隔值(CSV)等等,Google协议缓冲区,自定义二进制格式,Microsoft Excel工作簿等专有二进制格式,以及其他任何可能出现的内容。我将在主要外观周围使用包装器/装饰器来实现这些次要表示。这些次要陈述中的每一个都是可取的,特别是在某些情况下与其他系统相结合,但由于各种缺点(未能满足上面列出的一个或多个标准),它们都不适合作为主要陈述。

因此,到目前为止,我选择JSON格式作为我的主要传输内容表示。我打算在不久的将来详细探讨这一选择。

只有在出于极端性能考虑的情况下,我才会跳过翻译基础常规格式。干净设计的优点包括良好的性能(没有浪费的努力,便于维护),一个体面的硬件选择应该是唯一必要的补充。当性能需求变得极端时(例如,每天处理四万个传入数据文件总计四千万次事务),那么无论如何都必须重新考虑一切。

作为一名开发人员,DBA,架构师等,我已经构建了实际上各种规模和描述的系统。我对我选择的标准充满信心,并热切期待确认其适用性。事实上,我希望以开放源码的形式发布一个实现(但不要屏住呼吸)。

请注意,此设计讨论忽略了有意识的传输介质(HTTP,SMTP,RMI,.Net Remoting等)。我发现将运输介质和运输内容作为完全独立的设计考虑因素,相互之间以及所讨论的系统进行处理是非常有效的。事实上,我的意图是使这些实际上“可插拔”。

因此,我鼓励您强烈考虑JSON。最好的祝愿。

0

由于@DanVinton说,如果你需要这在内部使用(我的意思是“

内部使用

它仅用于我的部件,而不是组件别人写的

你可以连接k眼睛和价值。 我更喜欢使用键和键和键和值之间不同的分隔符:
而不是
key1+SEPARATOR+value1+SEPARATOR+key2 etc
我的代码
key1+SEPARATOR_KEY_AND_VALUE+value1+SEPARATOR_KEY(n)_AND_KEY(N+1)+key2 etc

如果你必须调试,这样更清晰(由设计过)

0

查看apache commons配置包。这将允许您将文件读取/保存为XML或属性格式。它还为您提供了将属性更改自动保存到文件的选项。

Apache Configuration

0

一个意识到这是一个古老的“无生气的”线程,但我有我认为这是值得扔在环的解决方案以前没有假定。

我们在标准XML属性格式的数据库中的单个CLOB列中存储地理features的“任意”属性(即用户在运行时创建的)。那就是:

name="value" name="value" name="value" 

要创建XML元素,只需将xml元素中的属性“包装”即可。那就是:

String xmlString += "<arbitraryAttributes" + arbitraryAttributesString + " />" 

将一个属性实例“序列化”到一个xml-attributes-string是一件容易的事......它就像十行代码。我们很幸运,因为我们可以将所有属性名称必须有效的规则强加给用户xml-element-names;和我们xml转义(即&quote;等)每个“价值”,以避免双引号和价值字符串中的任何问题。

这是有效的,灵活的,快速(足够)和简单

现在,说了这么多......如果我们再次有时间,我们会完全脱离整个“元数据问题”,将完整的未解释的元数据xml文档存储在CLOB中使用其中一个开源元数据编辑器来处理整个混乱。

干杯。基思。