public static ArrayList CreateObjects()
{
ArrayList objects = new ArrayList();
for(int i=0; i<10; i++)
{
A a = new A(i.ToString());
objects.Add(a);
}
return objects;
}
public string Name ;
public string Phone ;
public string Address ;
public string Description;
}
public class T
{
#region 对象的序列化和反序列化(Xml格式) XmlSerialize/XmlDeserialize
public static string XmlSerialize(object obj, params Type [] extra)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType(), extra);
using(MemoryStream stream = new MemoryStream())
{
serializer.Serialize(stream, obj);
stream.Close();
return Encoding.UTF8.GetString(stream.ToArray());
}
}
public static object XmlDeserialize(string xml, Type type)
{
XmlSerializer serializer = new XmlSerializer(type);
using(MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
return serializer.Deserialize(stream);
}
}
#endregion
public static void Main(string [] args)
{
string xml = XmlSerialize(A.CreateObjects(), typeof(A));
Console.WriteLine(xml);
}
}
public static ArrayList CreateObjects()
{
ArrayList objects = new ArrayList();
for(int i=0; i<10; i++)
{
A a = new A(i.ToString());
objects.Add(a);
}
return objects;
}
public string Name ;
public string Phone ;
public string Address ;
public string Description;
}
}
namespace MyWebService
{
public class AService : System.Web.Services.WebService
{
[WebMethod]
public string SerializeObjects()
{
ArrayList list = BusinessA.A.CreateObjects();
XmlSerializer ser = new XmlSerializer(list.GetType());
System.InvalidOperationException: 生成 XML 文档时出错。 ---> System.InvalidOperationException: 不应是类型 BusinessA.A。使用 XmlInclude 或 SoapInclude 属性静态指定非已知的类型。
at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write2_ArrayOfAnyType(Object o)
--- 内部异常堆栈跟踪的结尾 ---
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle)
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces)
at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o, XmlSerializerNamespaces namespaces)
at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o)
at AService.AService.SerializeObjects() in D:\WebServiceTest\aservice\aservice.asmx.cs:line 314
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not Page.IsPostBack Then
Dim myService As WebSvc.PA0010SVC = New WebSvc.PA0010SVC
Dim obj As Object() = myService.GetArrayList()
For i As Integer = 0 To obj.Length - 1
Response.Write("<h1>" + obj(i).ToString() + "</h1><br>")
Next
End If
End Sub
对于webservice中:首先你的对象可以继承于System.Attribute。这样序列化时,WebService会识别你的类结构。在Web引用时正确的在本地生成代理类, 这个代理类会去掉你的private,protected成员,改写你的get,set属性成为public.所以你自定义对象最好只有public成员.其次使用ArrayList在使用时用Object[]接收.
例子:
<WebMethod()> _
Public Function DisplayPersonInfo(ByVal objPerson As Person) As String
Dim person As Person = objPerson
Return person.Name
End Function
调用:
Dim myWebSvc As WebSvc.PA0010SVC = New WebSvc.PA0010SVC
Dim p As WebSvc.Person = New WebSvc.Person
p.Name = "Peter"
p.Age = "23"
Dim strPersonName As String = "null"
strPersonName = myWebSvc.DisplayPersonInfo(p)
Person类的定义:
Public Class Person
Inherits System.Attribute
Public Name As String
Public Age As String
End Class
我们可以看到在本地Person的代理类:
'<remarks/>
<System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://tempuri.org/ExcelService/Service1")> _
Public Class Person
Inherits Attribute
'<remarks/>
Public Name As String
'<remarks/>
Public Age As String
End Class
'<remarks/>
<System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://tempuri.org/ExcelService/Service1"), _
System.Xml.Serialization.XmlIncludeAttribute(GetType(Person))> _
Public MustInherit Class Attribute
End Class