XmlSerializer 序列化再反序列化

limeng_java 2011-12-30 11:18:08
我有一个需求,是使用XmlSerializer 序列化后,通过拼接后,再反序列化回来
希望能提供基本思路,有源码示例更好,在网上搜索了,源码跑不起来,刚接触.net,希望得到帮助

大体意思就是将XmlDocument类型的XML,重新拼接后,再返回一个XmlDocument格式的XML

例:
原XML
<?xml version="1.0" encoding="utf-8" ?>
<students>
<student name="张平" sex="15" num="1001">
<courses>
<course name="语文">
<teacherComment>
这里是语文老师的批注
</teacherComment>
</course>

<course name="数学">
<teacherComment>
这里是数学老师的批注
</teacherComment>
</course>
</courses>
</student>
</students>


根据需要进行改变
<?xml version="1.0" encoding="utf-8" ?>
<students_a>
<student_a name="张平">
<student_a sex="15" num="1001">
<courses_a>
<course_yw name="语文">
<teacherComment>
这里是语文老师的批注
</teacherComment>
</course_yw>

<course_sx name="数学">
<teacherComment>
这里是数学老师的批注
</teacherComment>
</course_sx>
</courses_a>
</student_a>
</student_a>
</students_a>
...全文
266 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
limeng_java 2011-12-31
  • 打赏
  • 举报
回复
不知道遇到关键字的时候该怎么处理呢?
[XmlElement]
public classitem[] class { get; set; }

这里的class是关键字```
段传涛 2011-12-30
  • 打赏
  • 举报
回复
/// <summary>
/// 序列化成字符串
/// </summary>
/// <param name="obj"></param>
/// <returns>序列化后的字符串</returns>
public static string Serialiaze(object obj)
{
XmlSerializer xs = new XmlSerializer(obj.GetType());
MemoryStream ms = new MemoryStream();
XmlTextWriter xtw = new XmlTextWriter(ms, System.Text.Encoding.UTF8);
xtw.Formatting = Formatting.Indented;
xs.Serialize(xtw, obj);
ms.Seek(0, SeekOrigin.Begin);
StreamReader sr = new StreamReader(ms);
string str = sr.ReadToEnd();
xtw.Close();
ms.Close();
return str;
}

/// <summary>
/// 反序列化 从字符串
/// </summary>
/// <param name="xml">xml字符串</param>
/// <param name="type">要生成的对象类型</param>
/// <returns>反序列化后的对象</returns>
public static object Deserialize(string xml, Type type)
{
XmlSerializer xs = new XmlSerializer(type);
StringReader sr = new StringReader(xml);
object obj = xs.Deserialize(sr);
return obj;
}










using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace DotNet.Common.Utilities
{
public class SerializeObj
{
public SerializeObj()
{ }

/// <summary>
/// 序列化 对象到字符串
/// </summary>
/// <param name="obj">泛型对象</param>
/// <returns>序列化后的字符串</returns>
public static string Serialize<T>(T obj)
{
try
{
IFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, obj);
stream.Position = 0;
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Flush();
stream.Close();
return Convert.ToBase64String(buffer);
}
catch (Exception ex)
{
throw new Exception("序列化失败,原因:" + ex.Message);
}
}

/// <summary>
/// 反序列化 字符串到对象
/// </summary>
/// <param name="obj">泛型对象</param>
/// <param name="str">要转换为对象的字符串</param>
/// <returns>反序列化出来的对象</returns>
public static T Desrialize<T>(T obj, string str)
{
try
{
obj = default(T);
IFormatter formatter = new BinaryFormatter();
byte[] buffer = Convert.FromBase64String(str);
MemoryStream stream = new MemoryStream(buffer);
obj = (T)formatter.Deserialize(stream);
stream.Flush();
stream.Close();
}
catch (Exception ex)
{
throw new Exception("反序列化失败,原因:" + ex.Message);
}
return obj;
}
}
}
danjiewu 2011-12-30
  • 打赏
  • 举报
回复
你想要实现什么样的目的呢?
jiuhexuan 2011-12-30
  • 打赏
  • 举报
回复
public static string XMLSerialize<T>(T t)
{
using (StringWriter sw = new StringWriter())
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add(string.Empty, string.Empty);//Add an empty namespace and empty value
XmlSerializer xz = new XmlSerializer(t.GetType());
xz.Serialize(sw, t, ns);
return sw.ToString();
}
}

public static T XMLDeserialize<T>(string xml) where T : new()
{
T t = new T();
using (StringReader sr = new StringReader(xml))
{
XmlSerializer xz = new XmlSerializer(t.GetType());
return (T)xz.Deserialize(sr);
}
}
limeng_java 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 limeng_java 的回复:]

还有一个问题
我想
让XML显示一个
<clientitem type="c2" id="xxx" keytoken="xxx" keytype="xxx" />
这样格式的
......
[/Quote]

10楼的问题已搞定
新问题`````
要生成显示的XML有一节点是关键字,这个怎么出来?才能让XML显示关键字,"class"
<class id=""...
limeng_java 2011-12-30
  • 打赏
  • 举报
回复
还有一个问题
我想
让XML显示一个
<clientitem type="c2" id="xxx" keytoken="xxx" keytype="xxx" />
这样格式的

而我现在只能写出这样的
<Clien>
<clientitem type="c2" id="xxx" keytoken="xxx" keytype="xxx" />
</Clien>

代码是
[XmlNamespaceDeclarations]
public clientitem[] Clien { get; set; }


public class clientitem
{
[XmlAttribute("type")]
public string Type { get; set; }

[XmlAttribute("id")]
public string Id { get; set; }

[XmlAttribute("keytoken")]
public string Keytoken { get; set; }

[XmlAttribute("keytype")]
public string Keytype { get; set; }
}
cfvgodot 2011-12-30
  • 打赏
  • 举报
回复
少写了一个

public class cats
{
public Items items{get;set;}
}


cfvgodot 2011-12-30
  • 打赏
  • 举报
回复

public class Item
{

}

public class Items:List<Item>
{

}

Items items=new Items();
//序列化items对象
chen_ya_ping 2011-12-30
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer(v=VS.80).aspx



http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html


XmlSerializer带来的性能问题及解决办法
http://www.cnblogs.com/juqiang/archive/2008/03/11/1100984.html
jiuhexuan 2011-12-30
  • 打赏
  • 举报
回复
[XmlRoot]
public class Cats
{

[XmlAttribute("color")]
public string Color { get; set; }

[XmlElement]
public List<item> items { get; set; }
}

Pulic class item
{
[XmlAttribute("color")]
public string Color { get; set; }

[XmlElement]
public string saying { get; set; }
}
limeng_java 2011-12-30
  • 打赏
  • 举报
回复
研究了一下,终于知道该怎么问了

以下是输出的结果,代码在下边
想要的效果是:
修改代码,可以将cats,也就是根节点可以加属性,例如:"<item color="White">"中,color="White"就是属性
还有子节点items也加属性
还有<items>可以再嵌套一个<items>,例如:"<items><items></items></items>"
<saying>可以加属性

我现在不知道怎么查Serialization这个方法真没用,都有哪些方法,和怎么去使用他的哪些好像是实体类的class?能否告知?谢谢```

<?xml version="1.0" encoding="gb2312"?>
<cats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<items>
<item color="White">
<saying>
White or black, so long as the cat can catch mice, it is a goodcat
</saying>
</item>
<item color="Black">
<saying>
White or black, so long as the cat can catch mice, it is a goodcat
</saying>
</item>
</items>
</cats>



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Xml.Serialization;

namespace UseXmlSerialization
{
class Program
{
static void Main(string[] args)
{
//声明一个猫咪对象
var cWhite = new Cat { Ttst = "ttttsdfasdf", Color = "White", Speed = 10, Saying = "White or black, so long as the cat can catch mice, it is a good cat" };
var cBlack = new Cat { Ttst = "ttttsdfasdf", Color = "Black", Speed = 10, Saying = "White or black, so long as the cat can catch mice, it is a good cat" };

CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite, cBlack } };

//序列化这个对象
XmlSerializer serializer = new XmlSerializer(typeof(CatCollection));

//将对象序列化输出到控制台
serializer.Serialize(Console.Out, cc);

Console.Read();
}
}

[XmlRoot("cats")]
public class CatCollection
{
[XmlArray("items"), XmlArrayItem("item")]
public Cat[] Cats { get; set; }


}

[XmlRoot("cat")]
public class Cat
{
//定义Color属性的序列化为cat节点的属性
[XmlAttribute("color")]
public string Color { get; set; }

//要求不序列化Speed属性
[XmlIgnore]
public int Speed { get; set; }

//设置Saying属性序列化为Xml子元素
[XmlElement("saying")]
public string Saying { get; set; }
}
}

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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