如果遇到:   根级别上的数据无效。 行 1,位置 1   。;即无法反序列化(反序列失败),得到对象为null ,把 xml 文本 Trim一下。

xml=xml.Trim();

序列化完毕你可以看到尾部有填充的 \0 。。。 要Trim掉。  参考:https://www.cnblogs.com/XChWaad/p/3346875.html

你可以TRIM 前后观察下Length. 有不可见空格

xml.Length
328

xml=xml.Trim();

xml.Length
327

XML SAMPLE:

<xml>

<bank_type><![CDATA[CFT]]></bank_type>
<cash_fee><![CDATA[1]]></cash_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>

<nonce_str><![CDATA[74971f5846d34fe0a35b8f636413f0e4]]></nonce_str>

<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[C46252FFBA5F10F39F7A040F3BC5D58D]]></sign>

<sub_is_subscribe><![CDATA[N]]></sub_is_subscribe>

<time_end><![CDATA[20190417113750]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>

</xml>

--

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;
using System.Xml; namespace SixunWxPayApi
{
public class XmlSerializerUtil
{ public static T Deserialize<T>( string xml)
{
      xml = xml.Trim(); //避免有不可见空格字符,导致无法反序列化
      Type type=typeof(T);
try
{ using (StringReader sr = new StringReader(xml))
{
XmlSerializer xmldes = new XmlSerializer(type);
return (T)xmldes.Deserialize(sr);
}
}
catch (Exception e)
{
// System.Diagnostics.Debug.WriteLine("ERROR " + e.StackTrace);
return default(T);
}
} //where T : class
public static string XmlSerializer<T>(T serialObject)
{
XmlSerializer ser = new XmlSerializer(typeof(T));
System.IO.MemoryStream mem = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8); // 强制指定命名空间,覆盖默认的命名空间
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty); ser.Serialize(writer, serialObject, namespaces);
writer.Close();

        string rst= Encoding.UTF8.GetString(mem.ToArray());
        rst = rst.Trim();//避免有不可见空格字符


        return rst;

        }

    }
}

--

实体类要加声明:

[XmlRootAttribute("xml", Namespace = "", IsNullable = false)]

调用:

WxResultBaseModel wrbm = XmlSerializerUtil.Deserialize<WxResultBaseModel>(strreturn);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Serialization; namespace SixunWxPayApi
{
/// <summary>
/// 微信返回数据基础model,XML根元素是"xml"
/// </summary>
[XmlRootAttribute("xml", Namespace = "", IsNullable = false)]
public class WxResultBaseModel
{
public string result_code { get; set; }
public string return_code { get; set; } public string sign { get; set; } public string mch_id { get; set; } public string sub_mch_id { get; set; } public string out_trade_no { get; set; } public string transaction_id { get; set; } public string trade_state { get; set; } public string total_fee { get; set; } }
}

--

//如果是数组,一定要指明XmlElement
[XmlElement("bankAccountVo")]

C# .NET XML 序列化为对象,反序列化的更多相关文章

  1. XML序列化成对象

    这个是和ALM上传测试结果结合使用的//把xml序列化成对象以及把对象序列化成xml using System; using System.Data; using System.Configurati ...

  2. Json序列化为对象方法

    /// <summary>/// json 序列化为对象/// </summary>/// <typeparam name="T">对象类型&l ...

  3. Android中序列化对象到XMl 和 XML反序列化为对象

    package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java. ...

  4. jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常

    问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段. 先附上我这段出现了问题的源码: // 1.接收并转化相应的参数.需要在pom.xml中 ...

  5. C# 后台解析json,简单方法 字符串序列化为对象,取值

    如果后台是一个JSON的字符串格式如下: string str = "{\"Success\":true,\"Msg\":\"成功!\&qu ...

  6. java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例

    package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import ...

  7. 匿名对象序列化为XML

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

  8. C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...

  9. JSON和XML格式与对象的序列化及反序列化的辅助类

    下面的代码主要是把对象序列化为JSON格式或XML格式等 using System; using System.Collections.Generic; using System.Globalizat ...

随机推荐

  1. jmeter下载和配置

    一.下载 1.进入官网:http://jmeter.apache.org/ 3.环境变量相关配置 电脑桌面---->“计算机”图标---->鼠标右键选择“属性”---->点击高级系统 ...

  2. MySQL安装与启动——Windows系统下

    以下书写结合菜鸟教程以及本人理解书写. 数据库下载(开源免费) MySQL数据库下载地址https://dev.mysql.com/downloads/mysql/ 可自由选择版本,一般选择Achiv ...

  3. 模拟post/get请求 类似于google的postman

    下载地址:https://www.getpostman.com/apps

  4. 五、stdout,stdoin和stderr

    stdout,stdin和stderr分别是标准输出流.标准输入流和标准错误流,当一个用户进程被创建的时候,系统会自动为该进程创建这三个数据流,默认情况下这三个流是在终端上表现出来的.可以使用fpri ...

  5. 练习UML类图中的类的表示

    第一部分:UML类图(class diagram) 类图用来展现一组类.类的特性以及其类相互之间的关系,一个类图由一组类以及它们之间的关系构成,类图用来对系统的领域概念以及静态结构进行建模. 在软件模 ...

  6. python基础一之while循环随机猜数字

    # Author:"Mamba" import random setNum = random.randint(1,10) #print(setNum) count = 0 whil ...

  7. Python 守护线程

    import time from threading import Thread from multiprocessing import Process #守护进程:主进程代码执行运行结束,守护进程随 ...

  8. vue-cli的使用(模板自定义、本地配置,eslint的配置)

    vue-cli(脚手架工具:帮助开发者完成基本的代码编写). 功能: 目录结构 本地调试 代码部署 热加载 单元测试 使用模板: vue init <template-name> < ...

  9. Android Studio 入口程序的设置方法

    在src -> main中 ,打开 AndroidManifest.xml 这个文件 下面这里有两个窗口,如果要想把哪个窗口设置成入口窗体,只要把下面红色的放在这个节点中就可以了 <act ...

  10. 关于atom无限意外退出的一个原因

    atom很好用,也有开发直接使用这个工具进行编码,我经常使用,最近突然会报意外退出的错误. 再重启应用依然会报这个错,然后重启电脑后可以正常使用. 非常疑惑. 原来,是因为Shadowsocks开启的 ...