0

jacksonfasterxmlを使用してケースクラスをシリアル化するのにうんざりしています。逆シリアル化後にコンストラクターパラメーター(taskRequestおよびtaskNameIn)を確認できますが、クラス内の変数は確認できません(たとえば、jobsRequestsはnullです):

//@JsonIgnoreProperties(ignoreUnknown = true) // tried to remove it with no luck
@JsonAutoDetect
case class Job(taskRequest: List[TaskRequest] = Nil,taskNameIn:String) {
{
this.jobsRequests = taskRequest
    this.taskName= taskNameIn
}
@JsonProperty
@volatile private var jobsRequests: List[TaskRequest] = Nil 

@JsonProperty
var task_name: String = ""

}

助言がありますか ?

4

2 に答える 2

0

そのため、シリアライゼーションに問題があり、簡単な場合もありますが、この問題を抱えている他の人やケースクラス全般の理解に役立つ何かを学びます。

まず、javap(.exe) を使用してクラス ファイルから Java コードを確認し、Job という名前のケース クラスが含まれる Job.scala に移動しました。Job$.class と Job.class の 2 つのクラス ファイルがあります。

ジョブ$.クラス:

public final class logic.Queue.Task.Job$ extends scala.runtime.AbstractFunction4<java.lang.Object, java.lang.String,   scala.collection.immutable.List<logic.Job.TaskRequest>, org.Server.Job.TaskContainer, logic.Queue.Task.Job>     implements scala.Serializable {
  public static final logic.Queue.Task.Job$ MODULE$;
  public static {};
  public final java.lang.String toString();
  .
  .
  .
}

Job.class:

public class logic.Queue.Task.Job implements scala.Product,scala.Serializable {
  public static org.Server.Job.TaskContainer apply$default$4();
  public static scala.collection.immutable.List<logic.Job.TaskRequest> apply$default$3();
  .
  .
  .
}

つまり、scala ケース クラスは匿名の内部クラスであり、それをシリアル化しようとすると (両方とも scala.Serializable を実装しているため可能です)、次の署名に追加して解決しました。

@JsonAutoDetect
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
@JsonCreator
case class Job(stat: Int = CmsTypeMsg.Pending, jobName: String = "", taskRequestIn: List[TaskRequest] = Nil, taskIn: TaskContainer = new TaskContainer()) 

この問題の詳細については、 http: //www.jpalomaki.fi/?p=527 Jackson を使用した別のクラス階層への JSON デシリアライズを参照してください。

于 2015-07-06T08:37:07.700 に答える
0

Jackson は、Java Beans 標準の Getter を使用して json を構築します。プロパティとコンストラクターのパラメーターに追加@BeanPropertyして、Getter/Setter を使用してクラスをコンパイルしてみてください。

または、Jackson Scala-Moduleを使用できます。彼らのテストを見て、このモジュールをシリアル化に使用する方法を確認できます。

于 2015-07-02T07:49:16.820 に答える