如何用XmlSerializer序列化Image数组

skillaaskill 2010-02-12 10:39:00
如题
...全文
388 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenhs 2010-02-23
  • 打赏
  • 举报
回复
int br;
while ((br=client.Receive(data)) > 0)
{
ms.Write(data,0,br);
}
乱世之殇 2010-02-23
  • 打赏
  • 举报
回复
学习中,!!!!!!!
skillaaskill 2010-02-17
  • 打赏
  • 举报
回复
自己最后再顶一次,有没人能帮忙解决一下?
skillaaskill 2010-02-16
  • 打赏
  • 举报
回复
这个问题到底出在哪?是序列化还是Socket的使用方法有问题?
skillaaskill 2010-02-15
  • 打赏
  • 举报
回复
恩,谢谢sp1234的指点。我是把image的图片用save转换成的byte[](base64也试过),在用这个给Hellobox的一个实例的字段赋值,再把这个HelloBox的实例序列化后发出去,这一系列步骤并没有报错误,整个程序就刚才地方会抛一个异常。
  • 打赏
  • 举报
回复
嗯,我说的是以byte[]来定义图片的时候的错误信息,而不是Image。

堆栈信息(特别是innerException信息)非常有用。除此以外,了解出错时的数据也很重要。在vs调试异常时,双击堆栈信息,可以转入当时的环境,打印当时的数据值。看看这些数据值,你大致自己就能发现程序运行的机制。
skillaaskill 2010-02-15
  • 打赏
  • 举报
回复
引用 21 楼 sp1234 的回复:
引用 19 楼 skillaaskill 的回复:
引用 18 楼 sp1234 的回复:引用 10 楼 skillaaskill 的回复: 这是HelloBox类的结构 C# code [Serializable] public class HelloBox { public byte[] pic; public string text; public HelloBox(); } xml序列化不需要那个Attribute声明就可以。 怎么看出不行呢?不懂你是怎么看的。

谢谢你,但我不是看的,我直接编译运行不过。

编译不过总有错误提示呀,有错误所在的行,有解释文字,你能看到呀!

看到了不贴出来,让人怎么猜呢?


奥,是个异常,异常信息在14楼,
具体一点的话

exception:
System.InvalidOperationException

stacktrace:
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)

innerException:
{"Data at the root level is invalid. Line 5, position 12."}

data:
{System.Collections.ListDictionaryInternal}
  • 打赏
  • 举报
回复
引用 19 楼 skillaaskill 的回复:
引用 18 楼 sp1234 的回复:引用 10 楼 skillaaskill 的回复: 这是HelloBox类的结构 C# code [Serializable] public class HelloBox { public byte[] pic; public string text; public HelloBox(); } xml序列化不需要那个Attribute声明就可以。 怎么看出不行呢?不懂你是怎么看的。

谢谢你,但我不是看的,我直接编译运行不过。


编译不过总有错误提示呀,有错误所在的行,有解释文字,你能看到呀!

看到了不贴出来,让人怎么猜呢?
skillaaskill 2010-02-15
  • 打赏
  • 举报
回复
引用 16 楼 michael555cdj 的回复:
可以将Image保存在Byte[]中!然后再XML序列化


我试过,还是报错,可能是哪个地方不对,方便的话可以贴下你的代码么?
skillaaskill 2010-02-15
  • 打赏
  • 举报
回复
引用 18 楼 sp1234 的回复:
引用 10 楼 skillaaskill 的回复:
这是HelloBox类的结构
C# code
[Serializable]
public class HelloBox
{
public byte[] pic;
public string text;

public HelloBox();
}

xml序列化不需要那个Attribute声明就可以。

怎么看出不行呢?不懂你是怎么看的。


谢谢你,但我不是看的,我直接编译运行不过。
skillaaskill 2010-02-15
  • 打赏
  • 举报
回复
别沉了,自己再顶一下
  • 打赏
  • 举报
回复
引用 10 楼 skillaaskill 的回复:
这是HelloBox类的结构
C# code
[Serializable]
public class HelloBox
{
public byte[] pic;
public string text;

public HelloBox();
}


xml序列化不需要那个Attribute声明就可以。

怎么看出不行呢?不懂你是怎么看的。
michael555cdj 2010-02-14
  • 打赏
  • 举报
回复
可以将Image保存在Byte[]中!然后再XML序列化
WC54321 2010-02-14
  • 打赏
  • 举报
回复
学习,帮你顶一下,另外你为什么非要用XmlSerializer?
aimeast 2010-02-13
  • 打赏
  • 举报
回复

http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer(VS.80).aspx

基元类型(如:整数、字符串和字节数组)以及某些特殊类型(如 XmlElement 和 DateTime),这些特殊类型也被视为基元类型。
数据协定类型(用 DataContractAttribute 属性标记的类型)。
用 SerializableAttribute 属性标记的类型,包括实现 ISerializable 接口的类型。
实现 IXmlSerializable 接口的类型。
许多常见集合类型,包括许多泛型集合类型。
许多 .NET Framework 类型属于后两种类别,因此可序列化。可序列化类型的数组也可序列化。有关完整列表,请参见在服务协定中指定数据传输。
skillaaskill 2010-02-13
  • 打赏
  • 举报
回复
似乎不是List的问题,直接Image也不行,代码如下

Client端

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(Dns.GetHostEntry("127.0.0.1").AddressList[0], 9999);

socket.Connect(ep);

HelloBox helloBox = new HelloBox();
helloBox.text = text;
helloBox.pic = pic;

XmlSerializer xs = new XmlSerializer(typeof(HelloBox));
MemoryStream ms = new MemoryStream();

xs.Serialize(ms, helloBox);

byte[] data = new byte[1024];

ms.Position = 0;
while (ms.Read(data, 0, 1024) > 0)
{
socket.Send(data);
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();


Server端

socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ep = new IPEndPoint(Dns.GetHostEntry("127.0.0.1").AddressList[0], 9999);

socket.Bind(ep);
socket.Listen(100);

Socket client = socket.Accept();

XmlSerializer xs = new XmlSerializer(typeof(HelloBox));
MemoryStream ms = new MemoryStream();

byte[] data = new byte[1024];

while (client.Receive(data) > 0)
{
ms.Write(data,0,1024);
}

ms.Position = 0;
HelloBox helloBox = xs.Deserialize(ms) as HelloBox;

return helloBox;


问题在哪里?还请各位指正
skillaaskill 2010-02-13
  • 打赏
  • 举报
回复
我没说清楚让aimeast误会了,那么这么说吧,如果要保留XmlSerializer的话要怎么改?
aimeast 2010-02-13
  • 打赏
  • 举报
回复
二进制数据必须要用二进制的序列化方法。
            Image image = VerifyCode.NextImage(6);
//XmlSerializer s = new XmlSerializer(image.GetType());
BinaryFormatter s = new BinaryFormatter();
using(FileStream fs = new FileStream("1.bin", FileMode.Create))
{
s.Serialize(fs, image);
}
using(FileStream fs = new FileStream("1.bin", FileMode.Open))
{
image = s.Deserialize(fs) as Image;
}
image.Save("1.png", ImageFormat.Png);
skillaaskill 2010-02-13
  • 打赏
  • 举报
回复
知道的帮帮忙吧,自己先顶下
skillaaskill 2010-02-13
  • 打赏
  • 举报
回复
错误信息是
There is an error in XML document (5, 12)
加载更多回复(8)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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