在反序列化错误中间XML错误.无法找到类型问题,怎么解决

如何开启反序列化的XML对象(。net)到一个单一的集合点分隔的命名键值?-c#,.net,xml,xslt,.net-2.0-CodeGo.net
如何开启反序列化的XML对象(。net)到一个单一的集合点分隔的命名键值?
开始,我不得不NET 2.0所以LINQ是不是一种选择(虽然我会看到一个LINQ的解决方案作为feed推移动到。NET 3.5的项目,如果它是很容易)。
我有一个加载和反序列化到C#类(验证发生在这我需要再打开该配置对象(包括默认值可通过xsd.exe的在建置在一个XML文件转化为一组C#类的一个XSD的导入的XML文件)中被填充到键值对的字典。
我想在字典的键是一个圆点分隔的路径值。属性值和文本将被视为值,其他一切前进的道路上的一个关键考虑这样做。
作为一个例子,假设下面的XML文件:
&rootNode&
&foo enabled="true"/&
&bar enabled="false" myAttribute="5.6"&
&baz&Some Text&/baz&
&baz&Some other text.&/baz&
&/rootNode&
会变成一个带有像钥匙字典:
"rootNode.foo.enabled" = (Boolean)true
"rootNode.bar.enabled" = (Boolean)false
"rootNode.bar.myAttribute" = (Float)5.6
"rootNode.bar.baz" = List&String& { "Some Text", "Some other text." }
值得注意的事情是,rootNode中都不放过不是很特别,但它没有文字或属性。此外 CodeGo.net,该词典是适当类型的(这个已经完成在反序列化,这是其中一个原因,我想用C#对象,而不是直接在XML的一个)对象的字典。
有趣的是.xsd.exe会创建的对象都已经非常接近我想要的表单。这个类是类的东西rootNodeFoo与浮点型字段上叫MyAttribute以。
其中一个我曾经考虑过,但我不知道如何去反射来遍历对象树的每个对象的类来计算出节点的(我可能需要调整的shell有点)的东西。这样做的问题是,它感觉就像错误的解决方案,因为我已经有机会获得一个解串器,应该是能够做到这一切,要快得多。
另一种选择是XSLT将数据直接的格式,我想怎么序列化。这里的问题是,我的XSLT的知识是有限的,我相信(如果我错了),我将失去打字的方式(一切都将是一个字符串),所以我将不得不从根本上反序列化再次被拿到手的类型背出(这不XSD验证,我得到了。NET解串器时)。
万一它的事项,来电我得到填充从XML文件中的配置对象是这样的:
var rootNode = new XmlRootAttribute();
rootNode.ElementName = "rootNode";
rootNode.Namespace = "urn:myNamespace";
var serializer = new XmlSerializer(typeof(rootNode), rootNode);
using (var reader = new StringReader(xmlString))
var deserializedObject = (rootNode)serializer.Deserialize(reader);
本文地址 :CodeGo.net/1105541/
-------------------------------------------------------------------------------------------------------------------------
1.优先观察:使用对象图是不是开始产生一个圆点表示的最佳场所。你在谈论的有,而且是一个定义明确的层次,你要生产一种从该点符号的节点; XML DOM的似乎是这样做的最好的地方。
有几个问题,你所描述的问题的方式。
首先是当它来处理多了你已经在你的榜样回避的问题,使该字典的价值实际上是一个列表,但假设你的XML看上去像这样的策略:
&rootNode&
&foo enabled="true"&
&bar enabled="false" myAttribute="5.6" /&
&bar enabled="true" myAttribute="3.4" /&
&/rootNode&
除了foo.enabled = (Boolean)true这应该是相当你提出了两个有什么字典键myAttribute叶?或者你有一个单一的入口,foo.bar.myAttribute = List&float& {5.6, 3.4}?所以 CodeGo.net,问题#1,有没有办法来处理多个类似,非叶子节点。
第二个问题是在选择一种数据类型做最终转化为叶节点(即属性或数值)。如果你正在编写一个Dictionary&string, object&System.Convert类。
假设对于这个问题#1不会浮出水面,那你没事了Dictionary&string, string&这里是让你开始代码:
static void Main(string[] args)
var xml = @"
&rootNode&
&foo enabled=""true""&
&bar enabled=""false"" myAttribute=""5.6"" /&
&baz&Text!&/baz&
&/rootNode&
var document = new XmlDocument();
document.LoadXml(xml);
var retVal = new Dictionary&string, string&();
Go(retVal, document.DocumentElement, new List&string&());
private static void Go(Dictionary&string, string& theDict, XmlElement start, List&string& keyTokens)
// Process simple content
var textNode = start.ChildNodes.OfType&XmlText&().SingleOrDefault();
if (textNode != null)
theDict[string.Join(".", keyTokens.ToArray())] = textNode.V
// Process attributes
foreach (XmlAttribute att in start.Attributes)
theDict[string.Join(".", keyTokens.ToArray()) + "." + att.Name] = att.V
// Process child nodes
foreach (var childNode in start.ChildNodes.OfType&XmlElement&())
Go(theDict, childNode, new List&string&(keyTokens) { childNode.Name }); // shorthand for .Add
而这里的结果:
一种方法是将一个格式化并插入标准的序列化模式,创建一个类,IFormatter即MyDotFormatter
然后如下图
Stream stream = File.Open(filename, FileMode.Create);
MyDotFormatter dotFormatter = new MyDotFormatter();
Console.WriteLine("Writing Object Information");
dotFormatter.Serialize(stream, objectToSerialize);
catch (SerializationException ex)
Console.WriteLine("Exception for Serialization data : " + ex.Message);
stream.Close();
Console.WriteLine("successfully wrote object information");
本文标题 :如何开启反序列化的XML对象(。net)到一个单一的集合点分隔的命名键值?
本文地址 :CodeGo.net/1105541/
Copyright (C) 2017 CodeGo.net程序让生活更美好,这里有很多值得你探索,感谢您留下的每一个脚印
C#/.NET 将对象序列化成XML和将XML反序列化成对象
日 |  | 浏览: 7,656
在实际的.NET项目中我们可能需要将数据暂时保存在XML中,而不是保存在数据库中,保存在XML中的数据最大的一个好处是跨平台,只要平台能够XML,那么就能实现跨平台数据库的共享。.NET提供了很多操作XML的API,然而我认为操作XML的方法,将对象序列化成XML和将XML反序列化成对象,莫过于下面的例子。
.NET将对象序列化成XML、将XML反序列化成对象
在方法中你只需要使用一句代码就可以完成对象序列化成XML字符串和将对象反序列化成对象,如下面的代码:
// 1. 首先要创建或者得到一个数据对象,这个对象根据你的实际操作的对象来自己设定,当然这个对象也可以是集合,比如IList
Person person= new Person()
name=”知道91″,
// 2. 用序列化的方法生成XML
string xmlPerson = XmlHelper.XmlSerialize(person, Encoding.UTF8);
// 3. 从XML读取数据并且生成对象
Person person2 = XmlHelper.XmlDeserialize
(xmlPerson , Encoding.UTF8);
你不用担心序列化的对象是什么结构的,是单个的对象也好,或者是一个集合List,你只需要关心能否存储成xml和能否取出来序列化成对象。只有上面的三行代码是不能运行的,最重要的是XMLHelper,它不是系统库中的类,是需要你自己写的,下面就是XmlHelper的核心代码
using System.Collections.G
using System.L
using System.T
using System.Xml.S
using System.IO;
using System.X
namespace MyMVC
public static class XmlHelper
/// 将一个对象序列化为XML字符串
要序列化的对象
/// 序列化产生的XML字符串
public static string XmlSerialize(object o, Encoding encoding)
using( MemoryStream stream = new MemoryStream() ) {
XmlSerializeInternal(stream, o, encoding);
stream.Position = 0;
using( StreamReader reader = new StreamReader(stream, encoding) ) {
return reader.ReadToEnd();
/// 从XML字符串中反序列化对象
/// 结果对象类型
包含对象的XML字符串
/// 反序列化得到的对象
public static T XmlDeserialize(string s, Encoding encoding)
if( string.IsNullOrEmpty(s) )
throw new ArgumentNullException(“s”);
if( encoding == null )
throw new ArgumentNullException(“encoding”);
XmlSerializer mySerializer = new XmlSerializer(typeof(T));
using( MemoryStream ms = new MemoryStream(encoding.GetBytes(s)) ) {
using( StreamReader sr = new StreamReader(ms, encoding) ) {
return (T)mySerializer.Deserialize(sr);
private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding)
if( o == null )
throw new ArgumentNullException(“o”);
if( encoding == null )
throw new ArgumentNullException(“encoding”);
XmlSerializer serializer = new XmlSerializer(o.GetType());
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent =
settings.NewLineChars = “\r\n”;
settings.Encoding =
settings.IndentChars = ”
using( XmlWriter writer = XmlWriter.Create(stream, settings) ) {
serializer.Serialize(writer, o);
writer.Close();
/// 将一个对象按XML序列化的方式写入到一个文件
要序列化的对象
保存文件路径
public static void XmlSerializeToFile(object o, string path, Encoding encoding)
if( string.IsNullOrEmpty(path) )
throw new ArgumentNullException(“path”);
using( FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write) ) {
XmlSerializeInternal(file, o, encoding);
/// 读入一个文件,并按XML的方式反序列化对象。
/// 结果对象类型
/// 反序列化得到的对象
public static T XmlDeserializeFromFile(string path, Encoding encoding)
if( string.IsNullOrEmpty(path) )
throw new ArgumentNullException(“path”);
if( encoding == null )
throw new ArgumentNullException(“encoding”);
string xml = File.ReadAllText(path, encoding);
return XmlDeserialize(xml, encoding);
利用XMLHelper你可以进行下面的操作
将一个对象序列化为XML字符串
从XML字符串中反序列化对象
将一个对象按XML序列化的方式写入到一个文件
读入一个文件,并按XML的方式反序列化对象
作者:知道91
除非注明,本文原创:,欢迎转载!转载请以链接形式注明本文地址,谢谢。原文链接:
知道91 - ASP.NET C# 连接 MSSQL 数据库详细图解,介绍c#连接 MSQL 的 web.config 字符串,演示远程连接 MSSQL 数据库的方法。
C#(.NET)代码实现邮箱、纯数字、电话号码、汉字、身份证号、整数或者小数、只能输入m~n位的数字和只能输入由26个大写英文字母组成的字符串的正则表达式的验证,介绍了...
NET MVC从客户端中检测到有潜在危险的 Request.Form 值的解决方法是屏蔽.NET ValidateRequest,本文介绍了两种解决方设置.NET ValidateRequest为false的方法。
在一些项目中我们总是需要去设计程序的运行时间,查看各种效率,对程序进行评估或者计算程序的执行时间长短进行计划任务,本文介绍三种计算C#/.NET获取控制台(Console...
网络中数据的传输方式通常是json格式,对于.NET程序json数据很不方便,因此我们需要将json格式数组转换成对象,有的是字符串属性简单对象,有的需要将json格式字符串转...
有时候我们希望把类的实例保存下来,存入数据库又来麻烦,所以我们选择将类实例保存到文件中,以便以后的时候用。这个时候如果采用类序列化的方式保存下来就非常简单,...
就算你积累了多年网站建设的经验,你都不可能一开始就建一个外观,速度,功能以及转化都很完美的网站。你能做的并且也是各个站长正在做的,无非是通过不断的监测来改进...
就算你积累了多年网站建设的经验,你都不可能一开始就建一个外观,速度,功能以及转化都很完美的网站。你能做的并且也是各个站长正在做的,无非是通过不断的监测来改进...
修改Oracle SGA(共享内存) 很多网站说修改Oracle的内存通过命令 如果你这么做了,那么恭喜你,你的Oracle数据库无法启动了。如果你已经这么做了,恢复Oracle启动的方...
要使用微信的接口必须在绑定的域名下测试;签名必须先向微信请求到access_token,然后用access_token再去请求jsapi_ticket,最后用jsapi_ticket和相关的参数按照ASCII码...
为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将工程分为四个层: 展现层(...
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WE...
本文讲述了Windows下 JIRA + Agile + Mysql 破解安装示例教程
知道91 - WP Super Cache是一...
网站合作和广告投放
联系邮箱:
(加好友请注明来意)
诚意交换友情链接
网站使用问题
请直接询问或者反馈,您也可以在网站直接给我们留言,谢谢!
欢迎关注知道91博客
(C) 2014 保留所有权利.&nbspXML文件序列化和反序列化的相关内容
来源:博客园
问题缘由:
XML反序列化出错,XML 文档(2, 2)中有错误,不应有 &configuration xmlns=''&
 
解决方法:
其实这个是很简单的,因为一般来说都是XML文档书写错误的问题!
只要把你想反序列化的对象,再序列化为XML文档。之后再对比之前出错的XML文档对比,就知道错误在哪了!

1 private void SerializeObject(string Xmlname)
2
XmlSerializer ser = new XmlSerializer(typeof(对象类型));
4
TextWriter writer = new StreamWriter(Xmlname);
6
ser.Serialize(writer, 对象);//要序列化的对象
7
writer.Close();
8
}

View Code
调用以上方法,可以把一个对象序列化XML文档(Xmlname:包含路径和Xml文件名)
 
以上摘自:
 
顺手更新了下,见代码:

 1
/// &summary&
 2
/// 序列化成XML文件
 3
/// &/summary&
 4
/// &typeparam name="T"&&/typeparam&
 5
/// &param name="path"&XML文件位置&/param&
 6
private static void SerializeXml&T&(string path) where T : new()
 7
T t = new T();
 9
var ser = new XmlSerializer(typeof(T));
10
TextWriter writer = new StreamWriter(path);
11
ser.Serialize(writer, t);//要序列化的对象
12
writer.Close();
13
}

 问题深入:
 根据上面的方法序列化实体对象,得到的为一个简答的XML文件。但是如果我的XML文件相对略复杂,有多个配置组。 如果只是简单的反序列化,则也会报上面的错误。
经过研究,发现了XML序列化和反序列化的一些规则。一个比较好的资料:,在代码的备注里解释的比较详细。
 
我的解决方法:
反序列化的方法:

/// &summary&
/// 反序列化
/// &/summary&
/// &param name="type"&对象类型&/param&
/// &param name="filename"&文件路径&/param&
/// &returns&&/returns&
public static object XmlDeserialize(Type type, string filename)
FileStream fs = null;
fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(type);
return serializer.Deserialize(fs);
catch (Exception ex)
throw
finally
if (fs != null)
fs.Close();
}

//调用:
var obj = (List&类&)XmlDeserialize(typeof(List&类&), path);

XML文件:

&?xml version="1.0" ?&
&ArrayOf类 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&
&URI&127.0.0.1:61616&/URI&
&TopicName&testTopic&/TopicName&
&ClientId&testClient&/ClientId&
&MessageType&IBytesMessage&/MessageType&
&UserName&admin&/UserName&
&Password&admin&/Password&
&/类& &类&  ........ &/类&
&/ArrayOf类&&!-这里面的类就是指的要反序列化的类的名字,要保持一致。这是多个实体类,所以上层必须要用”ArrayOf类“来说明,必须要保持一致!-&

类的定义:

/// &summary&
/// 实体类
/// &/summary&
[XmlRootAttribute("xml", IsNullable = false)]//必须有这个声明,从xml开始为root
public class 类名字
{    …… ……  }

以上是我的解决方法。
 
在文章有更详细的解释。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 fastjson序列化错误 的文章

 

随机推荐