2009-03-14 41 views
5

AMF3 specification xác định việc sử dụng cái gọi là "bảng tham chiếu" (xem Phần 2.2 của đặc tả này).Flash: AMF3 với các bảng tham chiếu?

Tôi đã thực hiện hành vi này trong bộ mã hóa/giải mã AMF3 mà tôi đã phát triển ở Erlang, nhưng không có nhiều kinh nghiệm với Flash API, tôi khó có thể tìm thấy cách tôi có thể dễ dàng buộc Flash sử dụng các bảng tham chiếu này khi sắp xếp các đối tượng đến AMF3; ví dụ: nếu tôi sử dụng ByteArray, có vẻ như nó chỉ lặp lại toàn bộ mã hóa đối tượng

var ba:ByteArray = new ByteArray(); 
ba.writeObject("some string1"); 
ba.writeObject("some string1"); 
# => 
# <<6,25,115,111,109,101,32,115,116,114,105,110,103,49, 
# 6,25,115,111,109,101,32,115,116,114,105,110,103,49>> 

(rõ ràng là một sự lặp lại).

Tuy nhiên, nếu hai chuỗi này là trong một cuộc gọi writeObject duy nhất, nó dường như sử dụng tài liệu tham khảo:

ba.writeObject(["some string1", "some string1"]); 
# => <<9,5,1,6,25,115,111,109,101,32,115,116,114,105,110,103,49,6,0>> 

Ổ cắm dường như cư xử theo cùng một cách.

Vì vậy, tôi có thể sử dụng các bảng tham chiếu trong mã Flash không? (miễn là tôi có thể có giao thức không chuẩn giữa ứng dụng Flash và máy chủ)

Cảm ơn bạn!

Trả lời

3

Tôi nghĩ sự khác biệt là trong ví dụ đầu tiên bạn viết hai chuỗi ký tự. Trong ví dụ thứ hai bạn đang viết một mảng (hoặc đối tượng phức tạp trong thông số kỹ thuật của Adobe) có tham chiếu đến hai chuỗi. Vì vậy, nếu bạn tham chiếu chuỗi từ một đối tượng hoặc một mảng, nó sẽ viết nó trong bảng tham chiếu. Đây không nhất thiết phải là một cách để thực thi nó nhưng có vẻ hợp lý rằng bộ nối tiếp AMF được tích hợp vào flash sẽ sắp xếp các đối tượng theo cách này vì vậy nó có lẽ là một cách đáng tin cậy để có được hành vi mong muốn của bạn (chuỗi bảng tham chiếu).

Tôi hy vọng điều đó sẽ hữu ích cho bạn!

+0

Tôi chỉ nghĩ rằng sẽ có một cơ chế để duy trì các bảng tham chiếu cho mỗi kết nối ... ít nhất đó là những gì tôi hiểu từ thông số AMF3 của họ ... Sigh. –

+0

nhưng dù sao cũng cảm ơn! –

0

Nhìn vào trang cuối cùng của thông số AMF3 chính thức và bạn sẽ thấy rằng ByteArray là khá nhiều vô giá trị. Bạn sẽ phải viết bộ tuần tự hóa/deserializer AMF3 của riêng bạn.

1

Theo bản án cuối cùng của đặc điểm kỹ thuật AMF3 (AMF 3.0 Spec at Adobe.com):

Cũng lưu ý rằng ByteArray sử dụng một tập mới của các bảng tham chiếu tiềm ẩn cho các đối tượng, đối tượng đặc điểm và chuỗi cho mỗi readObject và writeObject gọi.

Dường như ý định với ByteArray.writeObject là tạo một tuần tự hóa có thể được lưu trữ hoặc khôi phục trên cơ sở từng đối tượng.

Hành vi của đối tượng NetConnection tương tự như những gì bạn đã mong đợi.

Khi cập nhật bảng tham khảo chuỗi, điều quan trọng là không thêm chuỗi rỗng vào bảng tham chiếu.

Khi duy trì bảng tham chiếu đối tượng, bạn có thể thực hiện lập trình phòng thủ như sau: bảng tham chiếu đối tượng được xây dựng đệ quy và một số lần chứa các đối tượng mà các đặc điểm chưa được biết đến hoàn toàn. Nếu các chỉ mục bảng không được phân bổ trước, việc đánh số sẽ không nhất quán giữa các ứng dụng. Bộ giải mã AMF3 không nên sử dụng các đặc điểm từ một đối tượng được xây dựng một phần - đầu vào như vậy nên được gắn cờ là sai.

Bảng tham chiếu dây được triển khai tại bộ mã hóa bằng cách 'gắn thẻ' các đối tượng chuỗi trong bộ nhớ khi chúng được tuần tự hóa. Việc mã hóa hai đối tượng chuỗi khác nhau với cùng một nội dung (chuỗi phù hợp) dường như không được mã hóa bằng một chuỗi tham chiếu đến chuỗi khác. Cả hai chuỗi sẽ là đầu ra và một chuỗi tham chiếu sẽ không được sử dụng.

Có thể có giải pháp cho câu hỏi ban đầu của bạn. Nếu bạn có một số đối tượng tất cả thuộc cùng một lớp và bạn muốn lưu trữ tất cả các đối tượng đó trong một bộ nhớ, tôi đề xuất như sau: Tạo một "đối tượng cha mẹ" với các tham chiếu đến tất cả các đối tượng bạn dự định lưu trữ. Sau đó sử dụng ByteArray.writeObject để tồn tại đối tượng cha. AMF sẽ mã hóa tất cả các đối tượng được tham chiếu và sẽ đại diện cho các đặc điểm của các lớp đối tượng lặp lại một cách hiệu quả.

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