Nhìn thấy sức mạnh của Scala, tôi tự hỏi nếu một đồ thị đối tượng tùy ý có thể được tuần tự hóa và deserialized/từ XML sử dụng các tính năng và thư viện ngôn ngữ Scala tích hợp (ví dụ: không có XMLEncoder, XStream hoặc JAXB). Thật không may, tôi đã không tìm thấy một giải pháp như vậy. Bạn có thể tư vấn cho điều gì?Xem thêm Scala XML serialization
Trả lời
afaik không có thứ gì như vậy. Nhưng bạn có thể muốn xem sbinary
Không có gì trong thư viện lớp gốc của Scala. Nhưng không thiếu các thư viện Java sẽ làm điều này.
Về "lời khuyên", chúng tôi đã sử dụng thư viện gốc cho nhiều tệp cấu hình nhanh chóng và dơ bẩn. Ưu điểm chính là mã "phân tích cú pháp" được sử dụng để thêm các thông báo lỗi đẹp. Như thế này:
val xml = xml.XML.load(source)
val required = (xml \ "value").firstOption match {
case None => error("The value element is missing, or should I be a default?")
case Some(req) => req
}
Đây là nơi tôi thường sử dụng một cái gì đó như XStream, vì vậy nó không phải là một công tắc lớn. Tôi không chắc chắn nếu bạn có thể nhận được thông báo lỗi + xử lý mặc định trên khuôn khổ deserialization của bạn với một thư viện.
Tôi không biết "nếu đồ thị đối tượng tùy ý có thể được tuần tự hóa và deserialized thành/từ XML sử dụng các tính năng và thư viện ngôn ngữ Scala tích hợp", nhưng vì có một số hỗ trợ nguyên gốc cho XML trong Scala, tôi sẽ Đề cập đến chúng. Chi tiết hơn có thể được tìm thấy trong Ch. 26 của Programming in Scala được gọi là Làm việc với XML:
Chương này giới thiệu hỗ trợ của Scala cho XML. Sau khi thảo luận dữ liệu bán cấu trúc nói chung, nó hiển thị chức năng cần thiết trong Scala để thao tác XML: cách tạo các nút với XML literals, cách lưu và tải XML vào tệp và cách tách rời các nút XML sử dụng truy vấn phương pháp và đối sánh mẫu.
Để tóm tắt nhanh chương, tôi sẽ trích dẫn một số điểm chính.
- Scala bao gồm hỗ trợ đặc biệt để xử lý XML.
- Scala cho phép bạn nhập XML dưới dạng chữ ở bất kỳ đâu mà biểu thức hợp lệ.
- Bạn có thể đánh giá mã Scala ở giữa một chữ XML bằng cách sử dụng dấu ngoặc nhọn ({}) làm lối thoát.
Vì vậy, bạn có thể viết một cái gì đó như:
val foo = <a> {3 + 4} </a>
Các đánh giá lại ở trên để scala.xml.Elem = <a> 7 </a>
.
- Nếu bạn muốn tìm một phần tử con theo tên thẻ, chỉ cần gọi
\
với tên của thẻ. - Bạn có thể thực hiện "tìm kiếm sâu" và xem qua các phần tử phụ, v.v. bằng cách sử dụng
\\
thay vì toán tử\
.
Cuốn sách có một ví dụ về serialization và deserialization của một lớp trừu tượng, nhưng nó viết tay:
abstract class CCTherm {
val description: String
val yearMade: Int
def toXML =
<cctherm>
<description>{description}</description>
<yearMade>{yearMade}</yearMade>
</cctherm>
def fromXML(node: scala.xml.Node): CCTherm =
new CCTherm {
val description = (node \ "description").text
val yearMade = (node \ "yearMade").text.toInt
}
}
Cũng biết thêm có thể được tìm thấy trong một dự thảo cuốn sách được gọi là scala.xml.
Trong net.liftweb.json gói, đối tượng xml, tôi tìm thấy những chức năng sau đây:
def toXml(json: JValue): NodeSeq = {
def toXml(name: String, json: JValue): NodeSeq = json match {
case JObject(fields) => new XmlNode(name, fields flatMap { f => toXml(f.name, f.value) })
case JArray(xs) => xs flatMap { v => toXml(name, v) }
case JField(n, v) => new XmlNode(name, toXml(n, v))
case JInt(x) => new XmlElem(name, x.toString)
case JDouble(x) => new XmlElem(name, x.toString)
case JString(x) => new XmlElem(name, x)
case JBool(x) => new XmlElem(name, x.toString)
case JNull => new XmlElem(name, "null")
case JNothing => Text("")
}
json match {
case JField(n, v) => toXml(n, v)
case JObject(fields) => fields flatMap { f => toXml(f.name, f.value) }
case x => toXml("root", x)
}
}
Có một gói Khai thác có chức năng để chuyển đổi ít nhất lớp trường hợp để JSON. Cùng với toXml, điều này có thể chuyển đổi nhiều kiểu dữ liệu thành XML.
- 1. Xml Serialization Dynamic Ignore
- 2. Xml serialization trong C#
- 3. xml Conditional serialization
- 4. XML serialization + Namespaces (C#)
- 5. C# Xml Serialization & Deserialization
- 6. Enum serialization Json vs XML
- 7. Di xmlns trống = "" sau khi Xml serialization
- 8. XML serialization của Danh sách <T> - XML gốc
- 9. thuộc tính bắt buộc trong XML serialization
- 10. C# - serialization XML của các lớp thừa
- 11. thay đổi đầu ra của xml serialization
- 12. Java serialization vs JSON vs XML
- 13. JSON.Net Xml serialization hiểu sai mảng
- 14. xml serialization - xóa không gian tên
- 15. Serialization/deserialization nhanh nhất của Scala case classes
- 16. Làm thế nào để thêm thuộc tính cho C# XML Serialization
- 17. Xml serialization chắp thêm ký tự \ 0 (dấu gạch chéo ngược 0 hoặc Null)?
- 18. Marshalling/unmarshalling XML trong Scala
- 19. Generic serialization Danh sách XML với các lớp khác nhau
- 20. XML serialization của một bộ sưu tập trong C#
- 21. XML để JSON với Scala
- 22. Nối tiếp thành XML bằng cách sử dụng boost :: serialization
- 23. Các trường hợp Xml serialization không thành công trong .NET
- 24. NHibernate và XML Serialization với IList <T>
- 25. Làm thế nào để thay đổi tên gốc XML với XML serialization?
- 26. cách thêm chế độ xem vào bố cục XML android
- 27. XmlTextWriter serialization problem
- 28. scala - Chèn/cập nhật XML
- 29. C# TimeZoneInfo serialization
- 30. Hiệu năng XML Scala so với Java XML
Cảm ơn câu trả lời chi tiết. Tôi muốn một giải pháp chung mặc dù, nơi mã serialization được viết chỉ một lần và không phải trong mỗi lớp để tránh mã boilerplate và sao chép thông tin. – thSoft