2010-01-22 19 views
5

Đối diện của câu hỏi này: How do I add a type to GWT's Serialization Policy whitelist?Làm cách nào để xóa các loại triển khai khỏi Chính sách tuần tự hóa của GWT?

GWT đang thêm các loại không mong muốn vào chính sách tuần tự hóa và làm đầy đủ JS của tôi. Làm cách nào để tôi cắt danh sách trắng GWT của mình bằng tay? Hoặc tôi nên ở tất cả? Ví dụ, nếu tôi đặt Danh sách giao diện trên một lớp dịch vụ GWT RPC, GWT phải tạo Javascript để xử lý ArrayList, LinkedList, Stack, Vector, ... mặc dù nhóm của tôi biết rằng chúng ta sẽ chỉ trả về một ArrayList. Tôi chỉ có thể làm cho kiểu trả về của phương thức ArrayList, nhưng tôi thích dựa vào một giao diện hơn là thực hiện cụ thể. Xét cho cùng, có thể một ngày, chúng tôi sẽ chuyển đổi và trả lại ví dụ: một LinkedList. Trong trường hợp đó, tôi muốn ép buộc chính sách tuần tự hóa GWT chỉ biên dịch cho ArrayList và LinkedList. Không có Ngăn xếp hoặc Vectơ.

Những hạn chế tiềm ẩn này có một nhược điểm lớn mà tôi có thể nghĩ đến: một thành viên mới của nhóm bắt đầu trả lại Vectors, đây sẽ là lỗi thời gian chạy. Vì vậy, bên cạnh các câu hỏi trong tiêu đề, kinh nghiệm của bạn thiết kế xung quanh điều này là gì?

+0

Mục tiêu thiết kế của bạn là gì? Bảo vệ? hiệu suất? –

+1

Hiệu suất, theo một từ: để giảm kích thước của JS ngay bây giờ và trong tương lai. Nếu chúng ta bắt đầu gửi Sets và Maps qua RPC, sẽ có một vụ nổ lớp khác.Mục tiêu khác là duy trì thực hành mã hóa tốt nhất. Nếu có vấn đề về bảo mật tôi không thấy, hãy cho tôi biết. – Bluu

+0

Điều này dường như với tôi để có một giải pháp rất đơn giản. Rõ ràng bạn biết đó là gì, như bạn đã tự mình nói ra. Tại sao lại gặp nhiều rắc rối khi cố gắng thay đổi GWT? Điều đó có vẻ ngớ ngẩn. Trong tương lai, nếu bạn cần phải trả về LinkedList, thì bạn có thể thay đổi thành một giao diện. Tôi nghĩ nếu mục tiêu thiết kế của bạn là hiệu suất, thì chỉ cần thay đổi kiểu trả về thành ArrayList và được thực hiện với nó. 2 xu của tôi. –

Trả lời

7

Có thuộc tính có thể thực hiện danh sách cấm lớp này. Ví dụ, vào danh sách đen không ArrayList Collections, thêm các dòng này * .gwt.xml của bạn:

<extend-configuration-property name="rpc.blacklist" value="java.util.HashSet"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.LinkedHashSet"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.LinkedList"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.Stack"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.TreeMap"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.TreeSet"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.Vector"/> 

này là cần thiết cho tôi để giảm kích thước JS khi gửi GWT tích hợp trong com.google.gwt.user.client.ui.SuggestOracle$Response đối tượng qua dây dẫn. Các đối tượng này chứa một java.util.Collection, nhưng tôi biết rằng tôi sẽ chỉ gửi lại một ArrayList.

Tôi vẫn tôn trọng những lợi thế của việc kiểm tra thời gian biên dịch như được thảo luận trong các câu trả lời, nhận xét và câu hỏi ban đầu khác của tôi. Thật vậy, đây là một giải pháp flaky nếu GWT bắt đầu chọn các triển khai bổ sung để tuần tự hóa (tại sao đây không phải là một danh sách trắng?). Tuy nhiên, thuộc tính "rpc.blacklist" này đã lưu tôi khỏi việc tự cuộn SuggestOracle của riêng mình để có được một loại bộ sưu tập cụ thể hơn.

6

Trong khi không có khung tốt nên bao giờ cố gắng để thay đổi người dùng của nó, hãy để tôi cố gắng giải thích lý do tại sao GWT serialization hoạt động theo cách của nó. Tôi không biết cơ chế chính xác của điều này, vì vậy tôi có thể sai, nhưng đây là ý chính của những gì tôi đã nhìn thấy.

GWT đã xóa mã phụ ngoài giao diện RPC - ví dụ: nếu bạn sử dụng ứng dụng không có RPC, bạn có thể sử dụng giao diện như Danh sách và Bản đồ và Đặt thành nội dung trái tim của bạn - GWT sẽ tự động chỉ bao gồm triển khai mà bạn thực sự sử dụng. Tại sao? Bởi vì nó có quyền truy cập vào mã của bạn, và có khả năng thực sự đi qua tất cả các hoán vị có thể nhìn thấy của mã và cắt tỉa các lớp không sử dụng. Vì vậy, GWT thực sự không tạo ra các vụ nổ lớp khi các giao diện được sử dụng.

Vấn đề hoàn toàn là RPC. Điểm của dịch vụ RPC là máy chủ cần triển khai giao diện RPC - có nghĩa là nếu giao diện ra lệnh một phương thức cần trả về một danh sách, máy chủ sẽ tự do trả về bất kỳ việc thực hiện danh sách nào mà nó muốn, miễn là vì nó có thể được tuần tự hóa.

Thats vấn đề - GWT hoàn toàn không có cách nào để biết những gì thực hiện của một giao diện một máy chủ sẽ sử dụng, hoặc tại thời gian biên dịch hoặc tại một số điểm trong tương lai. Mã máy chủ có thể, và trong nhiều trường hợp, sẽ được phát triển độc lập với mã phía máy khách. Vì vậy, cách duy nhất để an toàn nhận được một đối tượng của loại Danh sách trên dây là để biết về mọi thực hiện có thể của nó trước.

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