相关文章推荐
暴走的伤疤  ·  C++ ...·  1 年前    · 
//aaa Example = XmlSerializeHelper.DESerializer(strxml); //序列化演示 //string strxml = XmlSerializeHelper.XmlSerialize(Example); #endregion /// /// 实体类转换成XML /// /// 类名 /// T类名的实例 /// public static string XmlSerialize(T obj) using (StringWriter sw = new StringWriter()) Type t = obj.GetType(); XmlSerializer serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(sw, obj); sw.Close(); return sw.ToString(); /// 对应的类 /// XML字符串 /// public static T DESerializer(string strXML) where T : class using (StringReader sr = new StringReader(strXML)) XmlSerializer serializer = new XmlSerializer(typeof(T)); return serializer.Deserialize(sr) as T; catch (Exception ex) return null; /// /// XML转换成实体类-方法2 /// /// /// /// public static object DeserializeFromXml(string xmlStr, Type type) using (StringReader sr = new StringReader(xmlStr)) XmlSerializer xs = new XmlSerializer(type); return xs.Deserialize(sr); catch (Exception ex) throw (ex); //Request

小技巧:在建立xml对应类时可自动建立,方法如下:

  1. 将完整的XML文本复制下来
  2. 新建一个类,将光标放在准备粘贴的位置
  3. 点击VS左上角的 [编辑] - [选择性粘贴] - [将XML粘贴为类]

注: 如果没有 [将xml粘贴为类] 的选项,右键  将 项目-属性-应用程序 中的目标框架改为.NET Framework 4.5 即可。

问题及解决

  • 问题 :数值类型为空时, 转换出错

在转换后的实体类中,有些属性因为业务需求,需要修改类型为Int32,Uint32等数字类型,但是给出的xml文本中,此项可能会没有值,导致在反序列化时会出错(即使在get方法中容错也不行)

  • 解决 :因为在反序列化的时候接受的属性是数字类型且xml文本中为空,就会出错,无论是否在get方法中容错;所以用属性类型为string的属性进行反序列化的对接,具体容错和赋值可在该string类型内的get方法中进行(可赋值给其他数值类型属性,string类型属性仅当做反序列化时的对接口),具体操作如下

举例说明:反序列化的类中有属性int num 和 string str 两个属性

//对应的实体类
public partial class aaa
        public string str { get; set; }
        [XmlIgnore]//取消反序列化
        public int num;
        //用string类型的属性来反序列化,将值转赋给原数值属性num
        [XmlElement(ElementName = "num")]//反序列化对应的属性名
        public string numStr
                return this.num.ToString();
                Int32 num1;
                Int32.TryParse(value.ToString(), out num1);
                this.num = num1;

注意:在XML反序列化中对应的类的属性必须为public才能被反序列化,private不能被反序列化

  • 问题:在转换带有列表的节点时识别错误(list,数组)

  • 解决:在列表标签下加2个及以上的子循环标签,进行转换时即可自动转换为数组

举例说明:转换对照

<eee:qqq xmlns:rrr="http://rrr" xmlns:eee="http://eee">
  <eee:vvv>
    <!--重复1-->
    <eee:mmm />
    <!--重复2-->
    <eee:mmm />
  </eee:vvv>
</eee:qqq>

生成结果: 

/// <remarks/>
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://eee")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://eee", IsNullable = false)]
    public partial class qqq
        private object[] vvvField;
        /// <remarks/>
        //public List<object> vvv { get; set; }
        [System.Xml.Serialization.XmlArrayItemAttribute("mmm", IsNullable = false)]
        public object[] vvv
                return this.vvvField;
                this.vvvField = value;
  • 问题:在XML序列化时怎样判断 必填属性是否被填写

  • 解决:利用自定义属性和get方法,
    • 1.将需要必填的类中属性添加 IsNullable = true 的自定义属性,当序列化为xml后,为null的属性的节点标签有 xsi:nil="true" 属性显示
    • 2.将需要必填的类中属性的get方法中添加约束,如果value为空时添加标识
    • 3.在序列化后的XML中查找指定的标识,即可判断必填属性是否都已填写

所需方法:

/// <summary>
/// 检查是否存在必填项未填错误
/// </summary>
/// <param name="XmlStr">带有标识,从类中转换出的xml数据</param>
/// <param name="ErrorKeyword">指定错误标识</param>
/// <returns></returns>
private static bool IsRequiredItemError(string XmlStr, string ErrorKeyword)
	XDocument xmlDocument = XDocument.Parse(XmlStr);
	//查询指定空识别
	if (XmlStr.Contains(ErrorKeyword))
		return true;
	//遍历节点属性是否有空
	List<XElement> elementList = new List<XElement>();
	GetElements(xmlDocument.Root.Elements(), "Objects", elementList, "Left");
	List<XAttribute> XAList = GetXattributes(elementList);
	foreach (XAttribute item in XAList)
		string XAname = item.Name.LocalName;
		string XAvalue = item.Value;
		if (XAname == "nil" && XAvalue=="true")
			return true;
	return false;
/// <summary>
/// 获取所有节点的所有属性
/// </summary>
/// <param name="elementList"></param>
/// <returns></returns>
public static List<XAttribute> GetXattributes(List<XElement> elementList)
	List<XAttribute> LXA = new List<XAttribute>();
	foreach (XElement item in elementList)
		IEnumerable<XAttribute> dd = item.Attributes();
		var ie = dd.GetEnumerator();                      // 通过GetEnumerator()方法返回IEnumerator迭代器
		while (ie.MoveNext())
			XAttribute XA = ie.Current;
			LXA.Add(XA);
	return LXA;
/// <summary>
/// 获取嵌套遍历XML中所有节点
/// </summary>
/// <param name="xElements"></param>
/// <param name="parentNodeName"></param>
/// <param name="elementList">接收</param>
/// <param name="dictionaryValue"></param>
public static void GetElements(IEnumerable<XElement> xElements, string parentNodeName, List<XElement> elementList, string dictionaryValue)
	foreach (XElement item in xElements)
		if (item.HasElements)
			GetElements(item.Elements(), parentNodeName + item.Name.ToString(), elementList, dictionaryValue);
			elementList.Add(item);
//读取XML
string inputtext = System.IO.File.ReadAllText("./XMLFile1.xml");
//将xml转换为类再转换为xml(可将必填项设置标识)
string sttt = XmlSerializeHelper.XmlSerialize(XmlSerializeHelper.DeserializeFromXml(inputtext, typeof(qqq)), Encoding.UTF8, new Dictionary<string, string>());
//必填项是否通还有空值
bool BL = IsRequiredItemError(sttt, "标识");
//需要注意的是,数组为空时不会被标注出来,如果大家有什么好的方法的话 欢迎留言
  • 问题:当类赋值后,转换为xml的字符串中 节点多了xmlns属性

         原因:当给类中Object类型的属性赋值时, 节点就会自动添加xmlns属性

         解决:将Object类型改为string类型即可

xml序列化时类的自定义属性

空值标识:IsNullable

[XmlElement(IsNullable = true)]   当示例转为XML文本时,带有此自定义属性的属性如果为null则会生成  xsi:nil = true 的属性
使用方式:[XmlElement(IsNullable = true)]
        public string Str
生成结果:<str xsi:nil="true" />
注意:标识一定要写在属性上,不能写在类上,必须写在类内的属性上!!!

指定序列化名称:ElementName

[XmlElement(ElementName = "str")]
public string aaastr
序列化结果: <str/>

 : 不同参数间可以用"," 间隔 如: [XmlElement(ElementName = "str", IsNullable = true)]

取消字段的正反序列化:[XmlIgnore]

使用方法: 在需要忽略序列化的字段上加上[XmlIgnore]即可
        [XmlIgnore]
        public string Str
转换方法using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Xml.Serialization;namespace WindowsFormsAppl...
说来惭愧,以前在去掉数组空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下:复制代码 代码如下:<?php   foreach( $arr as $k=>$v){       if( !$v )           unset( $arr[$k] );   }   ?> 而且自我感觉还挺不错,只是这样的效率并不高也曾经试过,先将$arr转为对象,然后利用对象的特性来删除,因为:foreach是将当前操作的数组进行copy,每操作一下foreach,都是copy了一个变量,页面里面如果有太多的foreach,会是一个很大的消耗。 在网上闲逛的时候
这篇文章主要讲述XML与对象的序列化与反序列化。并且会附上一些简单的序列化与反序列化方法,供大家使用。假设我们在一个Web项目中有这样两个类复制代码 代码如下:public class Member     {      public string Num { get; set; }      public string Name { get; set; }    }    public class Team    {       public  string Name;       public  List<Member> Members { get; set; }    }假设我们需要把T
解决方法如下: 方法1.将dll加入强名称,注册到全局程序集缓存中 方法2.在反序列化使用的IFormatter 对象加入Binder 属性,使其获取要反序列化的对象所在的程序集
如果你在一个的窗体项目中生成了序列化的二进制文件保存在本地,然后在另一个窗体项目中要访问该二进制文件,如果不做处理,则你在新的项目中是无法正常访问另一个项目中生成的二进制文件的,因为序列化时把序列化类的名称空间等信息保存了,但新的应用程序的名称空间和类库的名称空间是不一样的,所以找不到程序集。此时解决办法如下: 首先,把原先生成二进制的窗体项目变成程序集的形式,添加到新的项目的引用中,原先的窗体项目变成程序集的方法是在“解决方案资源管理器”中修改原先的项目属性中“应用程序”...
while(list($key, $val) = each($arr)){ if (is_array($val)){ $val = array_remove_empty($val); // does the result array contain anything? if (count($val)!=0){
在进行API开发的过程中,经常需要将数据从服务器端传输到客户端。而JSON作为一种通用的数据交换格式,通常被用来序列化和反序列化数据。 当我们在序列化JSON数据的时候,如果某些字段的值为空,我们可以选择不将它们序列化,而是忽略这个字段,这样可以减小数据传输的大小,提高数据传输效率。 举个例子,我们有一个包含多个学生信息的JSON数据,其中每个学生有三个字段,分别是姓名、年龄和成绩。如果某个学生的成绩是空值,我们不必将它序列化进JSON数据里面,可以选择忽略掉。这样可以减小数据传输的大小,提高效率。 在实际开发中,我们可以通过各种编程语言的JSON库来实现这个功能。比如在Python中,我们可以使用json库中的dump方法,并传入参数"skipna=True"来实现。而在Java中,则可以使用fastjson库中的SerializerFeature配置项中的WriteMapNullValue选项来实现。不同的编程语言可能有不同的实现方式,但是本质都是一样的,即忽略空值,减小数据传输大小,提高效率。 总之,在进行JSON数据序列化的过程中,我们可以通过一些设置来控制是否序列化空值。这样可以在一定程度上提高数据传输效率,优化API的性能表现。