Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java类toString()并从字符串返回?_Java - Fatal编程技术网

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

Java类toString()并从字符串返回?,java,Java,我使用自定义toString()函数创建了一些类: public class Test { public String eventName; public Long eventTime; //timestamp public Integer firstEventResult; public Integer secondEventResult; // ... and dozens more variables @Override publi

我使用自定义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()函数为我提供如下字符串:

事件(名称:Test,时间:123456789,firstEventResult:200)


在这种情况下,如何将上面的字符串再次转换回类?

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

选项1:

在一般情况下,您需要使用使用its和其他相关方法从字符串中获取对象

以下是要遵循的主要步骤:

  • 序列化为字节数组
  • 转换为Base64
  • 将Base64解码回字节数组
  • 最后反序列化
  • 你可以按照进一步的细节

    选项2:

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

    Event(name:Test, time:123456789, firstEventResult:200)
    
    • 事件(
    • 结尾)
    然后您可以执行以下操作:

  • 将值对转换为
    映射
  • 创建该类的新实例并从映射中设置值
  • publicstaticyourclassname fromString(stringstr){
    YourClassName结果=新建YourClassName();
    //移除起点和终点(未测试:P)
    字符串修剪=str.substring(6,str.length-7);
    String[]valuePairs=trimmed.split(“,”);
    映射值=新的HashMap();
    //将值对转换为映射
    for(字符串值对:值对){
    String[]pair=valuePair.split(“:”);
    字符串键=对[0];
    字符串值=对[1];
    value.put(键、值);
    }
    //逐个设置值
    if(values.get(“name”)!=null)result.name=values.get(“name”);
    if(values.get(“firstEventResult”)!=null)result.firstEventResult=Integer.parse(values.get(“firstEventResult”);
    //和所有其他人。。。
    返回结果;
    }
    
    尝试使用标准方式序列化-反序列化这些对象。。。类似于json的“使用toString()方法对我来说很重要”使您的问题看起来像。你能解释一下你到底想做什么,阻止你使用标准的序列化和反序列化吗?人们都投反对票,因为你还没有亲自尝试解决这个问题。人们投了反对票,因为这个问题以前被问过很多次,找到重复的问题就像把你的标题插入搜索栏一样简单。人们投反对票是因为,正如他们所说,这不是一个需要解决的有用问题
    toString
    不是可逆的序列化协议。这与宽恕无关。阅读帮助中心以更好地理解如何使用堆栈溢出(以及了解下行投票的含义)。“因为我有许多类是以这种方式序列化的”并不能解释太多。仅仅因为你在其他地方犯了错误并不意味着你需要到处重复。相反,慢慢来,改正你以前的错误。大多数任务已经有适当的工具使我们的生活更轻松。如果您想存储对象,您需要序列化(标准的序列化,或者如果您需要人类可读的格式,您可以使用JSON);事实上,这可能是对该类的误用。OIS实际上是用来读取通过标准Java序列化机制序列化的对象(来自文档:“ObjectInputStream反序列化以前使用ObjectOutputStream编写的基本数据和对象,”emphasis补充道)。如果您只想解析文本并创建一个对象,您可以使用普通解析来完成。见鬼,在这种情况下,你可以使用正则表达式。提取片段,然后使用它们实例化事件。