Java类toString()从字符串返回?

时间:2017-09-06 16:35:53

标签: java

我创建了一些带有自定义toString()函数的类:

public class Test {
    public String eventName;
    public Long eventTime; //timestamp
    public Integer firstEventResult;
    public Integer secondEventResult;
    // ... and dozens more variables

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("Event(");
        stringBuilder.append("name:");
        stringBuilder.append(this.eventName);
        stringBuilder.append(", ");
        stringBuilder.append("time:");
        stringBuilder.append(this.eventTime);
        if(firstEventResult != null) {
            stringBuilder.append(", ");
            stringBuilder.append("firstEventResult:");
            stringBuilder.append(this.firstEventResult);
        }
        if(secondEventResult != null) {
            stringBuilder.append(", ");
            stringBuilder.append("secondEventResult:");
            stringBuilder.append(this.secondEventResult);
        }
        // ...
        stringBuilder.append(")");
        return stringBuilder.toString();
    }
}

并且toString()函数为我提供了类似的字符串:

  

事件(姓名:测试,时间:123456789,firstEventResult:200)

在这种情况下,我怎样才能将上面的字符串转换回类?

1 个答案:

答案 0 :(得分:2)

如果您真的坚持使用.toString()使用标准序列化程序(如GSON)的自定义序列化,那么您需要编写自己的序列化程序/解析器来反序列化您的对象,为此您有两个选项:

选项1:

在一般情况下,您需要使用 ObjectInputStream class 来使用readObject()和其他相关方法从字符串中取回对象。

这些是要遵循的主要步骤:

  1. 序列化为字节数组。
  2. 转换为Base64。
  3. 将Base64解码回字节数组
  4. 最后反序列化。
  5. 您可以关注this OBJECT STREAMS – SERIALIZATION AND DESERIALIZATION IN JAVA EXAMPLE USING SERIALIZABLE INTERFACE article了解更多详情。

    选项2:

    否则,您可以使用RegexString操作提取对象成员,例如,如果您知道格式与此完全相同:

    Event(name:Test, time:123456789, firstEventResult:200)
    
    • Event(
    • 开头
    • ,
    • 分隔的值
    • )
    • 结尾

    然后你可以做到以下几点:

    1. 将值对转换为Map
    2. 创建此类的新实例并设置地图中的值
    3. public static YourClassName fromString( String str ) {
          YourClassName result = new YourClassName();
      
          // remove the start and ending ( not tested :P )
          String trimmed = str.substring( 6, str.length - 7 );
          String[] valuePairs = trimmed.split( ", " );
          Map<String, String> values = new HashMap<>();
      
          // convert value pairs into a map
          for ( String valuePair : valuePairs ) {
              String[] pair = valuePair.split( ":" );
              String key = pair[0];
              String value = pair[1];
              values.put( key, value );
          }
      
          // set the values one by one
          if ( values.get( "name" ) != null ) result.name = values.get( "name" );
          if ( values.get( "firstEventResult" ) != null ) result.firstEventResult = Integer.parse( values.get( "firstEventResult" ) );
          // and all others...
          return result;
      }