2010-08-09 31 views
7

Bây giờ tôi hiểu rằng các đối tượng scala @serializable có thể được sử dụng giống như một đối tượng Java Serializable. Trong một đối tượng có thể tuần tự hóa Java có các phương thức bạn có thể ghi đè để thay đổi cách đối tượng stream: writeObject (ObjectOutputStream)/readObject (ObjectOutputStream).Bạn có thể ghi đè các nhà văn luồng trong các đối tượng scala @serializable không?

Bạn có thể ghi đè hoặc chèn các phương thức vào đối tượng scala @serializable cho phép bạn thay đổi cách đối tượng tuần tự hóa không?

+0

Cảm ơn! Tôi đã nhận được chữ ký của phương pháp sai. –

Trả lời

8

Có, bạn có thể sử dụng phương pháp tương tự tại Scala như trong Java:

@throws(classOf[IOException]) 
private def writeObject(out: ObjectOutputStream): Unit = // ... 

@throws(classOf[IOException]) 
private def readObject(in: ObjectInputStream): Unit = // ... 
+0

readObject return Unit. Một ví dụ thực hiện mà làm cho một đối tượng là gì? Cho rằng nó là một phương pháp trên dụ? Các ví dụ trong java tất cả gọi this.someProperty để gán các giá trị. Làm thế nào để làm việc này trong scala với vals bất biến về các trường hợp lớp học? –

+0

@ScottSmith Tôi nghi ngờ bạn đang bị mắc kẹt bằng cách sử dụng các trường có thể thay đổi hoặc một số thủ thuật phản chiếu thực sự khó chịu. –

3

Như đã nêu, bạn có thể xác định riêng phương pháp writeObject và readObject của bạn.

@throws(classOf[java.io.IOException]) 
private def writeObject(out : java.io.ObjectOutputStream) : Unit = /* your definition here */ 

Tuy nhiên, hãy cẩn thận khi thực hiện điều này trên các lớp, đối tượng hoặc đặc điểm lồng nhau.

@serializable lớp Foo (x: Int) { @serializable đối tượng X {def y = x}}

Nếu tôi serialize đối tượng X, nó sẽ thực sự sắp đặt từng lớp Foo chứa, vì vậy phải này cũng có thể được tuần tự hóa. Đây có thể là một PITA để đối phó với các phương thức tuần tự hóa tùy chỉnh, vì vậy đây là cảnh báo công bằng.

Điểm đau khác có thể được đóng gói tuần tự hóa. Cố gắng giữ một mô hình tinh thần về những biến nào đang được chụp trong các đóng cửa tuần tự hóa. Đảm bảo rằng các biến này là thứ bạn muốn gửi qua IO!

Các vấn đề liên quan