61阅读

未将对象引用设置到对象的实例-利用XMLSerializer将对象串行化到XML

发布时间:2017-07-30 所属栏目:什么减肥药比较好

一 : 利用XMLSerializer将对象串行化到XML

微软已经意识到串行化数据的重要性,因此在.NET框架中包含了命名空间System.Runtime.Serialization和System.Xml.Serialization以提供串行化功能,为用户自己编写串行化方法提供了一个框架。System.Xml.Serialization命名空间提供了将一个对象串行化为XML格式的基本方法。下面我们来看看如何使用这种方法。

XML的魅力

串行化XML是指为了方便存储或传输,把一个对象的公共的域和属性保存为一种串行格式(这里是XML格式)的过程。非串行化则是使用串行的状态信息将对象从串行XML状态还原成原始状态的过程。因此,可以把串行化看作是将对象的状态保存到流或缓冲区中的一种方法。

串行化的目的是数据存储和数据转换。数据存储指的是在用户会话时保存数据。当应用程序关闭时,数据被保存(串行化),而当用户回来时,数据又被重新加载(非串行化)。数据转换指将数据变换成能被另一个系统识别的格式。使用串行化和XML,可以很方便的进行数据转换。

对象中的数据可以是类、方法、属性、私有类型、数组,在System.Xml.XmlElement或System.Xml.XmlAttribute对象中,它甚至可以是内嵌的XML。

System.Xml.Serialization命名空间中的关键类是XmlSerializer。当然在该命名空间中还包括有关XML其他方面以及SOAP相关的其他类,不过我们的重点是XmlSerializer类。

XmlSerializer

XmlSerializer类提供了把对象串行化为XML文件及把XML文档非串行化为对象的方法。它还能让用户指定对象如何转化为XML。可以把将被串行化的对象的类型作为类构造函数的参数。下面的C# 代码说明了构造函数的用法。


XmlSerializer ser = new XmlSerializer(typeof(objectToSerialize));

下面是等价的VB.NET代码:


Dim ser As New XmlSerializer(GetType(objectToSerialize))

实际的串行化过程在XmlSerializer类的Serialize方法中实现。该方法允许在串行化过程中调用TextWriter、Stream和XmlWriter对象。下面的例子代码说明了如何调用该方法。在本例中一个对象被串行化保存到本地磁盘的一个文件当中。例子中首先是类声明,后面紧接着是串行化源代码。


using System;
namespace BuilderSerialization {
public class Address {
public Address() {}
public string Address1;
public string Address2;
public string City;
public string State;
public string Zip;
public string Country;
} }
using System;
namespace BuilderSerialization {
public class Author {
public Author() { }
public string FirstName;
public string MiddleName;
public string LastName;
public string Title;
public string Gender;
public Address AddressObject;
} }
namespace BuilderSerialization {
public class Book {
public Book() { }
public string Title;
public Author AuthorObject;
public string ISBN;
public double RetailPrice;
public string Publisher;
}}
using System;
using System.Xml.Serialization;
using System.IO;
namespace BuilderSerialization {
class TestClass {
static void Main(string[] args) {
Book BookObject = new Book();
XmlSerializer ser = new XmlSerializer(typeof(Book));
TextWriter writer = new StreamWriter("booktest.xml");
BookObject.Title = "Practical LotusScript";
BookObject.ISBN = "1884777767 ";
BookObject.Publisher = "Manning Publications";
BookObject.RetailPrice = 43.95;
BookObject.AuthorObject = new Author();
BookObject.AuthorObject.FirstName = "Tony";
BookObject.AuthorObject.LastName = "Patton";
BookObject.AuthorObject.Gender = "Male";
BookObject.AuthorObject.AddressObject = new Address();
BookObject.AuthorObject.AddressObject.Address1 = "1 Main Street";
BookObject.AuthorObject.AddressObject.City = "Anywhere";
BookObject.AuthorObject.AddressObject.State = "KY";
BookObject.AuthorObject.AddressObject.Zip = "40000";
BookObject.AuthorObject.AddressObject.Country = "USA";
ser.Serialize(writer, BookObject);
writer.Close();
} } }

上面的代码把三个对象变为一个对象,因此在串行化过程中产生一个XML文件。以下是例子程序产生的XML文档:


<?xml version="1.0" encoding="utf-8"?>
<Book xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Title>Practical LotusScript</Title>
<AuthorObject>
<FirstName>Tony</FirstName>
<LastName>Patton</LastName>
<Gender>Male</Gender>
<AddressObject>
<Address1>1 Main Street</Address1>
<City>Anywhere</City>
<State>KY</State>
<Zip>40000</Zip>
<Country>USA</Country>
</AddressObject>
</AuthorObject>
<ISBN>1884777767 </ISBN>
<RetailPrice>43.95</RetailPrice>
<Publisher>Manning Publications</Publisher>
</Book>

注意串行化过程也能处理对象数据的嵌套。数据被转换成可识别的格式,方便了数据重载(非串行化)以及向另一个系统的数据传输。在数据传输过程时,接收方系统需要知道XML文件的格式(如果预先不知道的话)。因此需要提供一个XML schema文件。.NET框架中的XSD.exe工具可以为串行化XML生成一个schema文件。

下面是用VB.NET编写的例子代码:


Public Class Address
Public Address1 As String
Public Address2 As String
Public City As String
Public State As String
Public Zip As String
Public Country As String
End Class
Public Class Author
Public FirstName As String
Public MiddleName As String
Public LastName As String
Public Title As String
Public Gender As String
Public AddressObject As Address
End Class
Public Class Book
Public AuthorObject As Author
Public Title As String
Public ISBN As String
Public RetailPrice As Double
Public Publisher As String
End Class
Imports System.Xml.Serialization
Imports System.IO
Module Module1
Sub Main()
Dim BookObject As New Book
Dim ser As New XmlSerializer(GetType(Book))
Dim writer As New StreamWriter("booktest.xml")
With BookObject
.Title = "Practical LotusScript"
.ISBN = "1884777767 "
.Publisher = "Manning Publications"
.RetailPrice = 43.95
.AuthorObject = New Author
.AuthorObject.FirstName = "Tony"
.AuthorObject.LastName = "Patton"
.AuthorObject.Gender = "Male"
.AuthorObject.AddressObject = New Address
.AuthorObject.AddressObject.Address1 = "1 Main Street"
.AuthorObject.AddressObject.City = "Anywhere"
.AuthorObject.AddressObject.State = "KY"
.AuthorObject.AddressObject.Zip = "40000"
.AuthorObject.AddressObject.Country = "USA"
End With
ser.Serialize(writer, BookObject)
writer.Close()
End Sub
End Module

控制输出
 
 
串行化过程生成标准的XML文件,数据成员转换为XML元素。不过,并非所有的数据成员都变成元素,可以通过在类代码中添加一些标记来控制输出的XML文件。这样,数据成员可以变换为XML属性而非元素,也可以简单的被忽略掉。下面的例子是一段经过修改后的book类VB.NET代码。


Public Class Book
Public AuthorObject As Author
Public Title As String
<System.Xml.Serialization.XmlAttribute()> _
Public ISBN As String
<System.Xml.Serialization.XmlIgnoreAttribute()> _
Public RetailPrice As Double
Public Publisher As String
End Class

这段代码告诉系统在生成XML文件时把类成员ISBN作为XML属性,同时忽略掉RetailPrice成员。这种变化可以在生成的XML文件中可以看出:


<?xml version="1.0" encoding="utf-8"?>
<Book xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ISBN="1884777767 ">
<AuthorObject>
<FirstName>Tony</FirstName>
<LastName>Patton</LastName>
<Gender>Male</Gender>
<AddressObject>
<Address1>1 Main Street</Address1>
<City>Anywhere</City>
<State>KY</State>
<Zip>40000</Zip>
<Country>USA</Country>
</AddressObject>
</AuthorObject>
<Title>Practical LotusScript</Title>
<Publisher>Manning Publications</Publisher>
</Book>

以下是相应的C# 代码:


public class Book {
public Book() { }
public string Title;
public Author AuthorObject;
[System.Xml.Serialization.XmlAttribute()]
public string ISBN;
[System.Xml.Serialization.XmlIgnoreAttribute()]
public double RetailPrice;
public string Publisher;
}

上面仅是稍微提了两种标记符号。请查阅.NET文档以获得完整的标记符号。

非串行化

非串行化数据通过调用XmlSerializer类的Deserialize方法可以方便地实现。以下的VB.NET程序片断完成上文中XML文档的非串行化:


Dim BookObject As New Book
Dim ser As New XmlSerializer(GetType(Book))
Dim fs As New System.IO.FileStream("booktest.xml", FileMode.Open)
Dim reader As New System.XML.XmlTextReader(fs)
BookObject = CType(ser.Deserialize(reader), Book)

该程序把结果数据放入内存备用。下面是等价的C# 代码:


XmlSerializer ser = new XmlSerializer(typeof(Book));
System.IO.FileStreamfs = new System.IO.FileStream("booktest.xml",
FileMode.Open);
System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(fs);
Book BookObject = (Book)(ser.Deserialize(reader));

---------------------------------------------------
作者简介:Tony Patton是一名专业应用程序开发人员,知识面广泛,获得了Java、 VB、 Lotus和XML认证。

二 : 对于采药来说到后面.什么药实用比较多?比如象 &nbs

对于采药来说到后面.什么药实用比较多?

比如象&nbsp;&nbsp;梦叶草&nbsp;.......一些....
到底60后什么草药的需求比较大
这些草药在什么地方比较多
可以采到
知道的大侠们&nbsp;指教下


高级的黑莲花,山鼠,梦叶草,格罗姆之血,瘟疫花,幽灵菇 .

中级药草枯叶草,墓地苔.

低级的雨燕草(石南和魔皇伴生,做迅捷药水和菊花茶).

所有高级药草在厄运竞技场都会出。贼是采这个的好手。

三 : C# 中的未将对象引用设置到对象的实例

我在项目下的ConnectionClass中的代码如下:

using System;

using System.Data;

using System.Data.SqlClient;

namespace AssetManager.DBConnection

{

/// <summary>

/// ConnectionClass 的摘要说明。

/// </summary>

public class ConnectionClass

{

private SqlConnection objSqlConnection;

private SqlDataAdapter objSqlDataAdapter;

private DataTable objDataTable;

public ConnectionClass()

{

//

// TODO: 在此处添加构造函数逻辑

//

this.objSqlConnection=new SqlConnection("server=.;database=manager;uid=sa;pwd=123");

this.objSqlConnection.Open();

}

public int loginCheck(string strSql)

{

this.objSqlDataAdapter=new SqlDataAdapter();

this.objSqlDataAdapter.SelectCommand=new SqlCommand(strSql,this.objSqlConnection);

this.objDataTable=new DataTable();

this.objSqlDataAdapter.Fill(this.objDataTable);

int count=0;

count=this.objDataTable.Rows.Count;

return count;

}

}

}

在窗体的按钮事件中的代码如下:

private void btnLogin_Click(object sender, System.EventArgs e)

{

try

{

ConnectionClass conClass=new ConnectionClass();

this.loginName=this.txtName.Text.Trim();

this.pwd=this.txtPwd.Text.Trim();

string strSql="select * from OPERATOR where name='"+this.loginName+"' and password='"+this.pwd+"'";

int count=conClass.loginCheck(strSql);

if(count>0)

{

MessageBox.Show("登录成功");

}

else

{

MessageBox.Show("登录错误");

}

conClass.closeCon();

}

catch(Exception ex)

{

MessageBox.Show(ex.ToString());

}

}

每次点击按钮出发事件时都会报未将对象引用设置到对象的实例,且错误出在SqlConnection的open()方法处,这程序开始时就有这个毛病,我实在找不到错在哪里,后来不知怎的有一次好了,但后来又出问题,简直莫名其妙,拜托各位帮帮忙。

答案:

这是由于SqlConnection对象创建没有成功,objSqlConnection还是null值,所以你每次调用它的Open()方法都会报出未将对象引用设置到对象的实例的异常。

分析一:

数据库连接字符串问题,由于提供的数据库连接字符串不正确,而作为SqlConnection类的构造函数参数,objSqlConnction不能成功创建。你需要做的是检查一下数据库连接字符串,看看数据库连接和用户名密码是否正确?

分析二:

由于objSqlConnection第一次创建后调用了Open()方法,但是一直没有显式的关闭它,试试在你调用完loginCheck函数后,关闭数据库连接,objSqlConnection.Close();

四 : Error:未将对象引用设置到对象的实例

出现“未将对象引用设置到对象的实例”错误的一般原因:

1、ViewState 对象为Null。
2、DateSet 为空。
3、sql语句或Datebase的原因导致DataReader空。
4、声明字符串变量时未赋空值就应用变量。
5、未用new初始化对象。
6、Session对象为空。
7、对控件赋文本值时,值不存在
8、使用Request.QueryString()时,所获取的对象不存在,或在值为空时未赋初始值
9、使用FindControl时,控件不存在却没有做预处理
10、重复定义造成未将对象引用设置到对象的实例错误

二、

(1)所设置的变量为空值或没有取到值,一般出现在传递参数的时候出现这个问题,也会在使用DataGrid或Gridview或Datalist等数据控件时出现.

(2)控件名称与codebehind里面的没有对应

(3)未用new初始化对象

(4)在程序中所引用的控件不存在

解决方法:

(1)使用try..catch...finally捕捉错误,或直接用response.write()输出所取的变量值

(2)查看代码中是否存在未初始化的变量

三、

SqlConnection.Open未将对象引用设置到对象的实例

在使用VS2003开发ASP.NET程序时候有时候操作SqlConnection对象的Open()方法时候会出现

未将对象引用设置到对象的实例。

说明:执行当前Web请求期间,出现未处理的异常。检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

conn.Open();

跟踪调试也肯定可以确定对conn进行new操作但是程序经常在这个地方报错,但是有时候重启服务器或者重启IIS有能正常使用了。怎么调试也找不到问题那么这个时候可能是你本机上安装的.NETFRAMEEWORK框架有问题,可能没有没有安装SP1.1补丁

解决方法:打NETFRAMEEWORK1.1SP1的补丁(微软官方网站下载安装)

四、出现NullReferenceException异常

1、对象所在的命名空间没有引用

2、对象没有实例化

3、出现异常,实例化失败对象为null

五、IIS

当应用程序的用户访问量超过它能承受的范围之后,就会出错。

改善程序,使用缓存,尽量减少与数据库交互的次数。

六、重置了DataSet引用,会出现问题,检查自己的代码,是不是在其他地方重新引用了,可能DataSet被设置成全局对象。

七、当以上所有的方法不行时,打上.netframework的补丁

八、还可能网站里面DAL的dll文件失效,业务层实例化不了IDAL

九、

为每个可疑的地方添加监视,替换掉页面级全局对象

本文由百分网提供,原文地址:

自己错误原因:不够细心,打错了代码

五 : Xap 包装失败。未将对象引用设置到对象的实例。 解决办法

我在编译 Windows Phone Toolkit 时.(从网上直接下来的源码.)

遇到了 Xap 包装失败。未将对象引用设置到对象的实例。

这个的错误.

耽误大半天时间才到到原来是图片文件中有一个图片不存在了.还有一个"引用"

删除即可.

当然这不仅限于此项目.遇到这个提示请检查一下文件是否有缺失.

如果帮到你,顶一下哦!

摘自 蝗虫的大腿

扩展:未将对象引用到实例 / 网上报税引用对象实例 / 未将对象引用实例

本文标题:未将对象引用设置到对象的实例-利用XMLSerializer将对象串行化到XML
本文地址: http://www.61k.com/1056969.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1