Реализация Scala Set для использования в бизнес-модели?

Допустим, мы хотим построить большую социальную сеть (потому что социальные сети сейчас в моде). Мы начнем с простой предпосылки, что любой, кто хочет использовать нашу социальную сеть, должен иметь возможность зарегистрироваться под своим именем, а затем стать друзьями или поссориться с другими людьми, зарегистрированными у нас:

import scala.collection._

class Person (var name: String) {
    private val _friends = new mutable.HashSet[Person]

    def befriends     (p: Person) { _friends+=p }
    def fallsOutWith  (p: Person) { _friends-=p }
    def friends () = _friends toSet
    override def toString = name
}

Пока все хорошо:

val brad     = new Person("Brad Pitt")
val angelina = new Person("Angelina Jolie")

brad befriends angelina
angelina befriends brad 

Хорошая вещь! Последний штрих, давайте посмотрим список всех друзей Брэда:

brad.friends.foreach(println)

Это работает, и мы ' мы собираемся покорить мир с нашей замечательной социальной сетью, полностью состоящей из Scala!

Теперь о скучных технических деталях. Нам нужно иметь возможность сохранять данные, и db4o кажется хорошим выбором, еще немного кода:

 db store brad // job done!

А затем восстановить Брэда с жесткого диска:

 val q = db.query       
 q.constrain(classOf[Person])
 q.descend("name").constrain("Brad Pitt")           
 val brad = q.execute.get(0)                

Еще раз посмотреть список друзей ...

 brad.friends.foreach(println)

и БАХ! NullPointerException ! После небольшой отладки выясняется, что базовое хранилище данных mutable.HashSet, на которое мы полагаемся для отслеживания друзей, определено как transient в scala.collection.mutable.FlatHashTable ]:

@transient protected var table: Array[AnyRef] = new Array(initialCapacity) 

и, следовательно, когда мы говорим db4o хранить Person, фактический список друзей не сериализуется. Похоже, что db4o должен использовать вместо этого методы readObject и writeObject HashSet.

Интересно, есть ли способ указать db4o правильно сериализовать / десериализовать HashSet или есть более подходящая реализация Scala Set, дружественная к db4o?

1
задан Vlad Gudim 21 October 2010 в 14:55
поделиться