我创建了一些带有自定义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)
在这种情况下,我怎样才能将上面的字符串转换回类?
答案 0 :(得分:2)
如果您真的坚持使用.toString()
使用标准序列化程序(如GSON)的自定义序列化,那么您需要编写自己的序列化程序/解析器来反序列化您的对象,为此您有两个选项:
选项1:
在一般情况下,您需要使用 ObjectInputStream
class 来使用readObject()
和其他相关方法从字符串中取回对象。
这些是要遵循的主要步骤:
您可以关注this OBJECT STREAMS – SERIALIZATION AND DESERIALIZATION IN JAVA EXAMPLE USING SERIALIZABLE INTERFACE article了解更多详情。
选项2:
否则,您可以使用Regex
或String
操作提取对象成员,例如,如果您知道格式与此完全相同:
Event(name:Test, time:123456789, firstEventResult:200)
Event(
,
)
然后你可以做到以下几点:
Map
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;
}