2009-06-03 36 views
9

Tôi cần chuyển đối tượng tùy chỉnh đến một dịch vụ web từ xa. Tôi đã đọc rằng nó có thể là cần thiết để thực hiện ISerializable, nhưng tôi đã làm điều đó và tôi gặp khó khăn. Cách thích hợp trong C# để truyền một đối tượng tùy chỉnh cho một phương thức dịch vụ web là gì?C# .NET Web Services - Truyền các đối tượng tùy chỉnh đến một dịch vụ web

+0

Nó có thể là tốt hơn nếu bạn có thể được cụ thể về những khó khăn bạn đang gặp phải. Bạn đang cố gắng làm gì? Có lẽ một số ví dụ cụ thể sẽ giúp ích. Những gì bạn có nghĩa là "vượt qua một đối tượng tùy chỉnh"? điều đó có thể có nghĩa là nhiều thứ. Một số chi tiết cụ thể sẽ giúp ích. – Cheeso

Trả lời

6

Đối tượng mà bạn cung cấp như các đối số là một phần của yêu cầu dịch vụ phải được đánh dấu với [Serializable] và dựa trên một số các câu trả lời đã đăng trước tôi, bạn cũng cần đảm bảo đối tượng tùy chỉnh của bạn không chứa bất kỳ tham số nào trong hàm tạo.

Cũng nên nhớ bất kỳ logic nào bạn có bên trong lớp học sẽ không được tạo trong lớp proxy được tạo ở phía máy khách. Tất cả những gì bạn thấy ở phía máy khách là một hàm tạo và các thuộc tính mặc định. Vì vậy, nếu bạn thêm các phương thức cho các đối tượng tùy chỉnh của mình, hãy nhớ rằng máy khách sẽ không nhìn thấy chúng hoặc có thể sử dụng chúng.

Điều tương tự cũng xảy ra đối với bất kỳ logic nào bạn có thể đưa vào bất kỳ thuộc tính nào.

Ví dụ

[Serializable] 
public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
+4

Jim, xin lỗi, nhưng [Serializable] không liên quan gì đến các dịch vụ web. –

+0

@John: Tại sao không?Không phải XmlSerializer cũng dựa vào thuộc tính [Serializable]? – fretje

+0

Đã thêm ví dụ. Tôi sử dụng các [Serializable] thuộc tính tất cả các thời gian khi cần phải có một đối tượng tùy chỉnh được serialized. –

0

Chỉnh sửa: đã xóa phần về [Serializable]

Bạn đang tạo dịch vụ hoặc tiêu thụ?

Để tạo một đối tượng có thể được chuyển thành tham số của một webmethod, bạn không phải làm bất cứ điều gì đặc biệt. Đó là nếu bạn đang tạo một dịch vụ web asmx.

OTOH, Nếu bạn đang tạo dịch vụ WCF thì bạn phải đánh dấu lớp đó bằng [DataContract] và tất cả các thành viên bạn muốn được tuần tự hóa với [DataMember].

Nếu bạn đang sử dụng dịch vụ web, thì các lớp proxy cho đối tượng cần truyền sẽ được tạo khi bạn thêm tham chiếu dịch vụ. Bạn chỉ cần sử dụng chúng.

+0

Thực ra tôi đang làm và tiêu thụ. Những gì bạn đã đề cập ở đây là những gì tôi đã làm, nhưng tôi tiếp tục nhận được khiếu nại từ VS về việc cần một constructor parameterless trong đối tượng tùy chỉnh (mà tôi đã thêm vào, nhưng vô ích.). –

+0

sau đó bạn có thể cung cấp mã có liên quan và chính xác * khiếu nại * ;-) – fretje

5

Trông giống như một bản sao này question

Dù sao, tất cả các đối tượng tham gia vào tương tác WS nên XML-serializable, không ISerializable (đó là nhị phân serialization). Hơn nữa, chúng nên được mô tả trong hợp đồng dịch vụ (WSDL), nếu không khách hàng sẽ không thể tiêu thụ chúng. This article sẽ hữu ích khi hiểu tuần tự hóa XML với Dịch vụ web XML.

Tuy nhiên, nếu bạn đang nói về thực sự tùy chỉnh đối tượng (ví dụ: bất kỳ loại nào). Bạn nên xem xét chuyển chúng ở dạng nhị phân: hoặc dưới dạng mã hóa base64 hoặc dưới dạng tệp đính kèm. Câu hỏi tôi liên kết đến có một câu trả lời làm thế nào để làm điều đó.

0

Nhìn vào question này để xem làm thế nào để thực hiện serialization XML cho các đối tượng tùy chỉnh của bạn

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