问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何将XML与OBJECT进行相互转换

发布网友 发布时间:2022-04-23 00:59

我来回答

1个回答

热心网友 时间:2022-04-23 02:28

过年的这段时间一直没有闲着,总体来说可以分为以下2个部分的学习。

1:ORMCodeHelper的参考与学习。

2:MVC3的学习。

对于ORMCodeHelper(Keny的),完全的采用插件式开发,即插即用,个人感觉还是比较爽的,架构不错。它包括了SQL SERVER
2000,SQL SERVER 2005以及ORACLE的相关C#代码的生成。比哥一年前写的那个牛多了,哈哈,哥去年乱写了个网页版的(http://www.cnblogs.com/jasenkin/archive/2010/02/11/1667511.html),
现在看一年前的代码,哥感叹,这个谁写的代码,*实在写的太烂了!!!当然,ORMCodeHelper与CodeSmith相比,还是有差距的哦。
霖哥以前给我的codesmith模板(N层的),哥一直没时间仔细看,哥知道那个模板可以把所有的代码全部生成,其中包括N层代码、存储过程、页面等
等。虽然时间就像乳沟,只要挤一挤总还是有的!但是,哥真的......本来9号哥都是请假休息的,唉,又要哥上班了....

还有就是对于MVC3,Razor实在太给力了,扔掉MVC2吧,哈哈,@确实挺不错的。

在ORMCodeHelper中,对于配置文件的使用的思路还是不错的,哥学以致用,提炼个泛型的出来(其实最主要的还是插件开发的架构)。对于
XML与OBJECT的转换来说,下面讲的是一种Serialize方法。其实哥还有另外一种通过反射将XML转换成对象的方法,不过,涉及到公
司****,那种方法还是不写了。当然,那种方法哥是可以横着写了(因为哥早就背在心里了),哈哈,通用的代码....

先看代码,如下:

public static class Serializer
{

public static void Serialize<T>(string filePath, T[] array) where T:new()
{
if (string.IsNullOrEmpty(filePath)||
array == null||array.Length==0)
{
return;
}

try
{
XmlSerializerFactory xmlSerializerFactory = new XmlSerializerFactory();
XmlSerializer xmlSerializer =
xmlSerializerFactory.CreateSerializer(array.GetType(), typeof(T).Name);
Stream stream = new FileStream(filePath, FileMode.Create);
xmlSerializer.Serialize(stream, array);
stream.Close();
}
catch
{
}
}

public static void Serialize(string filePath, object obj)
{
if (string.IsNullOrEmpty(filePath) || obj == null)
{
return;
}

try
{
XmlSerializerFactory xmlSerializerFactory = new XmlSerializerFactory();
XmlSerializer xmlSerializer =
xmlSerializerFactory.CreateSerializer(obj.GetType(), obj.GetType().Name);
Stream stream = new FileStream(filePath, FileMode.Create);
xmlSerializer.Serialize(stream, obj);
stream.Close();
}
catch
{
}
}

}

public static List<T> Deserialize<T>(string filePath) where T:new()
{
List<T> results=new List<T>();
if (string.IsNullOrEmpty(filePath)||!File.Exists(filePath))
{
return results;
}
object obj = null;
try
{
XmlSerializerFactory xmlSerializerFactory = new XmlSerializerFactory();
XmlSerializer xmlSerializer =
xmlSerializerFactory.CreateSerializer(typeof(T[]), typeof(T).Name);
Stream stream = new FileStream(filePath, System.IO.FileMode.Open);
obj = xmlSerializer.Deserialize(stream);
stream.Close();

results.AddRange(obj as T[]);
}
catch
{
}

return results;
}

public static object Deserialize(string filePath, Type targetType)
{
if (string.IsNullOrEmpty(filePath)||!File.Exists(filePath)
|| targetType == null)
{
return null;
}

object obj = null;
try
{
XmlSerializerFactory xmlSerializerFactory = new XmlSerializerFactory();
XmlSerializer xmlSerializer =
xmlSerializerFactory.CreateSerializer(targetType, targetType.Name);
Stream stream = new FileStream(filePath, FileMode.Open);
obj = xmlSerializer.Deserialize(stream);
stream.Close();
}
catch
{
}

return obj;
}

从上面4个方法,可以看出主要是通过XmlSerializer将对象序列化为XML以及将XML反序列化为对象,这种方法比较简单,而且易用。

(一)Serialize<T>(string filePath, T[] array),Deserialize<T>(string filePath)

通过单元测试来看看Serialize<T>(string filePath, T[] array)方法生成的XML内容,先注释掉//DeleteFile(filePath);

public void SerializeTestHelper(AppSetting[] inputs)
{
AppSetting[] settings = inputs;
string filePath = @"d:\" + typeof(AppSetting).Name + ".config";

Serializer.Serialize<AppSetting>(filePath, settings);
List<AppSetting> results = Serializer.Deserialize<AppSetting>(filePath);

int length = results.Count;
Assert.IsTrue(length == settings.Length);

for (int index = 0; index < length; index++)
{
Assert.IsTrue(results[index].Value == settings[index].Value);
Assert.IsTrue(results[index].Key == settings[index].Key);
Assert.IsTrue(results[index].Author == settings[index].Author);
}

//DeleteFile(filePath);
}

生成的XML如下:

<?xml version="1.0"?>
<ArrayOfAppSetting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AppSetting">
<AppSetting>
<Key>key0</Key>
<Value>value0</Value>
<Author>author0</Author>
</AppSetting>
<AppSetting>
<Key>key1</Key>
<Value>value1</Value>
<Author>author1</Author>
</AppSetting>
<AppSetting>
<Key>key2</Key>
<Value>value2</Value>
<Author>author2</Author>
</AppSetting>
</ArrayOfAppSetting>

从上面的单元测试可以看出:通过Serialize<T>(string filePath, T[]
array)方法将对象数组生成XML内容,可以通过Deserialize<T>(string
filePath)将XML内容转换成相应的对象数组,内容相一致。

(二)Serialize(string filePath, object obj),Deserialize(string filePath, Type targetType)
通过单元测试来看看Serialize(string filePath, object obj)方法生成的XML内容,先注释掉//DeleteFile(filePath);

private static void SerializeTestHelper()
{
AppSetting setting = new AppSetting()
{
Author = "AuthorTest",
Key = "KeyTest",
Value = "ValueTest"
};
string filePath = @"d:\" + typeof(AppSetting).Name + ".config";

Serializer.Serialize(filePath, setting);
AppSetting result = Serializer.Deserialize(filePath, typeof(AppSetting)) as AppSetting;

Assert.IsTrue(result.Value == setting.Value);
Assert.IsTrue(result.Author == setting.Author);
Assert.IsTrue(result.Key == setting.Key);

//DeleteFile(filePath);
}

生成的XML如下:

<?xml version="1.0"?>
<AppSetting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AppSetting">
<Key>KeyTest</Key>
<Value>ValueTest</Value>
<Author>AuthorTest</Author>
</AppSetting>

从上面的单元测试可以看出:通过Serialize(string filePath, object
obj)方法将对象生成XML内容,可以通过Deserialize(string filePath, Type
targetType)将XML内容转换成相应的对象,内容相一致。其中,object也可以是对象数组的,这个留给读者自己去验证。

测试都是可以通过的,这里仅仅是验证正确的功能
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
万能粉碎机清洁规程 中药粉碎机如何清洗比较好 磨粉机能用水洗吗 正确的家用粉碎机清洗方法 粉碎机清洗不干净粉碎机怎么清洗才干净 励志语句长句精选123句 caxa如何保存图幅模板 美迪特MDT-IN158重要参数 打玻尿酸已一个月眼睛疼,会不会打玻尿酸一个月,突然眼睛疼会不会... 玻尿酸失明概率真的小吗-玻尿酸失明有光感还能恢复吗 陈华军人物简介 为什么银行存款和库存现金之间的业务只制作付款凭证? 仿真银行存款单制作方法? 会计学银行存款余额调节表的制作 制作银行存款余额调节表 银行存款作成现金时怎么办 高仿银行存款单制作 如何制作XLS银行存款账 银行存款对得上需要制作银行存款余额调节表吗 是黄龙玉吗? 说是缅甸黄龙玉,请问到底是什么材质? OPPO A92s手机使用Breeno 识屏的方法? 热电阻双金属温度计的系统组成 OPPO A55Breeno识屏可以为手机使用带来什么样的便利? OPPO K9Breeno识屏可以为手机使用带来什么样的便利? 在云南请的黄龙玉貔貅,大家帮忙看看,不懂黄龙玉 OPPO Find X3 ProBreeno识屏可以为手机使用带来什么样的便利? 怎样煮鸡蛋能不破 OPPO A8手机使用Breeno 识屏的方法? OPPO Find X3Breeno识屏可以为手机使用带来什么样的便利? 黄龙玉里面有沙一样的材质,是真的吗? 银行存款日记帐手工帐怎么做 银行的各种存款方式、现行利率以及如何让计算利息。制作一张调查表。 分析通用汽车的没顶之灾? 能源股普涨,通用股价却下跌3%,通用汽车公司不行了吗? 上海通用破产了吗 通用全球员工暂时降薪两成,福特警示裁员风险高管缓发半薪 火星智谷(厦门)教育科技有限公司怎么样? 午夜狂情的介绍 求午夜狂情 电影,最好能发。能下载的也可以。 朋友叫我一起开餐饮管理公司!让我出资占股20%其他3人已技术入股!这样合理不? 一部张延和程前主演的恐怖片 谁知道大型的连锁超市一般是什么样的股权结构 以特许经营方式扩展请问等于股权转让吗?主要我想问的是公司被人加盟其股东本身股份是否会稀释 Dj - Disco - 东莞桥头新世纪 午夜狂情 里面的粤语歌名 我们不是好友为什么有时候能看他朋友圈十张照片有时候又看不了十张照片_百度问一问 子公司可以成为特许经营条令中所要求的“一年二店”中的&quot;直营店&quot;吗? 非对方的朋友只显示最近十条朋友圈为什么有时候可以看见朋友圈内容有时候又看_百度问一问 为什么对方同一条朋友圈一时看见一时看不见 我的朋友圈只显示我女朋友的照片并无任何内容傍边有一朵花但时有时无请问对方有没有屏敝我的朋友圈? 为什么对方的朋友圈照片时而看的到时而看不到