.Net序列化对象能否序列化一组对象

dianweihu 2005-04-14 08:56:39
我已经用XMLSerializer可以序列化一个对象实例
对于一组对象实例,假设存放在ArrayList中的一组类A的实例,我该如何序列化呢?
序列化后又该如何反序列化成一组实例呢?

望高人指教。
...全文
135 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiaoci 2005-04-14
  • 打赏
  • 举报
回复
XmlSerialize(object obj, params Type [] extra)

注意我用的是 params, 所以穿 typeof(BusinessA.A)是没有问题的
dianweihu 2005-04-14
  • 打赏
  • 举报
回复
谢谢!

传入参数extra的定义
Type [] extra= new Type[1];
extraTypes[0] = typeof(BusinessA.A);
直接用typeof(BusinessA.A)编译出错
tiaoci 2005-04-14
  • 打赏
  • 举报
回复
只要把你附加的类型告诉XmlSerializer就可以了

using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Xml.Serialization;

[Serializable]
public class A : System.Attribute
{
public A()
{
}

public A(string aname)
{
Name = aname;
Phone = aname + " Phone";
Address = aname + " Address";
Description = aname + " Description";
}

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);
}
}

sdenli 2005-04-14
  • 打赏
  • 举报
回复
GZ
dianweihu 2005-04-14
  • 打赏
  • 举报
回复
为什么总是提示我这样的错误?
代码如下:


using System;

namespace BusinessA
{

[Serializable]
public class A : System.Attribute
{
public A()
{
}

pulbic A(string aname)
{
Name = aname;
Phone = aname + " Phone";
Address = aname + " Address";
Description = aname + " Description";
}

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());

TextWriter writer = new StreamWriter("C:\\temp.XML");
ser.Serialize(writer, list);
writer.Close();
}
}
}
============================================
错误:

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

机器人 2005-04-14
  • 打赏
  • 举报
回复
使用ArrayList:

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
tiaoci 2005-04-14
  • 打赏
  • 举报
回复
using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Xml.Serialization;

public class T
{
#region 对象的序列化和反序列化(Xml格式) XmlSerialize/XmlDeserialize
public static string XmlSerialize(object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
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(new ArrayList(new object[]{"Hello", 123, 456.78f, 9.101m}));
Console.WriteLine(XmlSerialize(new ArrayList(new object[]{"Hello", 123, 456.78f, 9.101m})));
Console.WriteLine(XmlSerialize(XmlDeserialize(xml, typeof(ArrayList))));
}
}

机器人 2005-04-14
  • 打赏
  • 举报
回复
对于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

所以你直接自定义类型继承于System.Attribute比较方便,但是你也可以使用
System.Xml.Serialization.XmlIncludeAttribute来标识WebMethod中的类型.
tiaoci 2005-04-14
  • 打赏
  • 举报
回复
XMLSerializer支持ArrayList的把,

(ICollection的都支持,只要里面每个对象都能被序列化就可以了)

dianweihu 2005-04-14
  • 打赏
  • 举报
回复
:)
谢谢了

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧