2013-02-09 3 views
1

Я использую класс case, который - среди других параметров - создается с шестнадцатеричным значением BigInt. Я использую класс case для десериализации сообщений JSON через Jerkson/Jackson. Красота использования Jackson заключается в том, что de/serialization работает из коробки для классов классов на основе их подписи (я думаю).scala определяющий класс с дополнительным параметром для типа

Теперь значение BigInt в шестнадцатеричном кодировании должно быть создано с дополнительным параметром radix: BigInt (hexValue, 16). Однако мои сообщения JSON не содержат такого параметра. Я ищу решение для определения этого radix в моем определении класса case, чтобы Джексон продолжал использовать класс без конфигурации. Что-то вроде:

case class MyClass(name: String, hexValue: BigInt(hexValue, 16)) 

Я понимаю, что альтернативные подходы могли бы быть: а) определить JSON де/сериализации явно или б) определить свой собственный класс-обертку BigInt. Однако я ищу более элегантное решение «scala-ish» - если оно есть.

Примечание: Int не является достаточным, он должен быть BigInt.

ответ

2

Вы можете переопределить метод apply настроить case class экземпляра ..

case class MyClass (name: String, hexValue: BigInt) 

object MyClass{ 
    def apply(name: String, hexValue: String) = 
          new MyClass(name,BigInt(hexValue,16)) 
} 

Используйте его как

MyClass("Foo","29ABCDEF") //> res0: MyClass = MyClass(Foo,699125231) 
1

Я думаю, что вам лучше пойти с оберткой на BigInt. Что-то вроде

import java.math.BigInteger 

class BigHexInt(hexString: String) 
extends BigInt(new BigInteger(hexString, 16)) 

Затем написать case class с помощью BigHexInt:

case class MyClass(name: String, bigHex: BigHextInt) 
Смежные вопросы