用 DataContractSerializer 将类序列化到 XML 报异常,求解?

josxhn 2014-07-05 09:08:54
34行报异常:

“System.Runtime.Serialization.InvalidDataContractException”类型的未经处理的异常在 System.Runtime.Serialization.dll 中发生

其他信息: 无法序列化类型“Xml_DataContractSerializer.Program+Customer”。请考虑将其标以 DataContractAttribute 特性,并将其所有要序列化的成员标以 DataMemberAttribute 特性。如果类型为集合,则请考虑将其标以 CollectionDataContractAttribute 特性。有关其他受支持的类型,请参见 Microsoft .NET Framework 文档。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Xml;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;


namespace Xml_DataContractSerializer
{
class Program
{
static void Main(string[] args)
{
Customer cc = new Customer(1, "John");

SerializeToXML<Customer>(cc, "X:/Users/lx/Desktop/Log/customer.xml");

Console.Read();
}

/// <summary>
/// 序列化辅助方法
/// </summary>
static void SerializeToXML<T>(T instance, string fileName)
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
using (XmlWriter writer = new XmlTextWriter(fileName, Encoding.UTF8))
{
serializer.WriteObject(writer, instance);
}
}

[DataContract]
public class Customer
{

public Customer(int id, string cn)
{
Unid = id;
CustomerName = cn;
}

[DataMember]
public int Unid { get; set; }
[DataMember]
public string CustomerName { get; set; }
}


[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum, Inherited = false, AllowMultiple = false)]
public sealed class DataContractAttribute : Attribute
{
// 摘要:初始化 System.Runtime.Serialization.DataContractAttribute 类的新实例。
public DataContractAttribute() { }
// 摘要: 获取或设置一个值,该值指示是否保留对象引用数据。
// 返回结果:如果使用标准 XML 保留对象引用数据,则为 true;否则为 false。 默认值为 false。
public bool IsReference { get; set; }

// 摘要: 获取或设置类型的数据协定的名称。
// 返回结果:数据协定的本地名称。 默认值是应用了该属性的类的名称。
public string Name { get; set; }

// 摘要:获取或设置类型的数据协定的命名空间。
// 返回结果:协定的命名空间。
public string Namespace { get; set; }
}

// 摘要:当应用于类型的成员时,指定该成员是数据协定的一部分并可由 System.Runtime.Serialization.DataContractSerializer进行序列化。
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
public sealed class DataMemberAttribute : Attribute
{
// 摘要:初始化 System.Runtime.Serialization.DataMemberAttribute 类的新实例。
public DataMemberAttribute() { }

// 摘要:获取或设置一个值,该值指定是否对正在被序列化的字段或属性的默认值进行序列化。
// 返回结果:如果应该在序列化流中生成成员的默认值,则为 true;否则为 false。 默认值为 true。
public bool EmitDefaultValue { get; set; }

// 摘要:获取或设置一个值,该值用于指示序列化引擎在读取或反序列化时成员必须存在。
// 返回结果:如果该成员是必需的,则为 true;否则为 false。
// 异常:System.Runtime.Serialization.SerializationException:该成员不存在。
public bool IsRequired { get; set; }

// 摘要:获取或设置数据成员名称。
// 返回结果:该数据成员的名称。 默认值是应用该属性的目标的名称。
public string Name { get; set; }

// 摘要:获取或设置成员的序列化和反序列化的顺序。
// 返回结果:序列化或反序列化的数字顺序。
public int Order { get; set; }
}
}
}

...全文
365 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wind_cloud2011 2014-07-05
  • 打赏
  • 举报
回复
不要这些代码: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum, Inherited = false, AllowMultiple = false)] public sealed class DataContractAttribute : Attribute { // 摘要:初始化 System.Runtime.Serialization.DataContractAttribute 类的新实例。 public DataContractAttribute() { } // 摘要: 获取或设置一个值,该值指示是否保留对象引用数据。 // 返回结果:如果使用标准 XML 保留对象引用数据,则为 true;否则为 false。 默认值为 false。 public bool IsReference { get; set; } // 摘要: 获取或设置类型的数据协定的名称。 // 返回结果:数据协定的本地名称。 默认值是应用了该属性的类的名称。 public string Name { get; set; } // 摘要:获取或设置类型的数据协定的命名空间。 // 返回结果:协定的命名空间。 public string Namespace { get; set; } } // 摘要:当应用于类型的成员时,指定该成员是数据协定的一部分并可由 System.Runtime.Serialization.DataContractSerializer进行序列化。 [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, Inherited = false, AllowMultiple = false)] public sealed class DataMemberAttribute : Attribute { // 摘要:初始化 System.Runtime.Serialization.DataMemberAttribute 类的新实例。 public DataMemberAttribute() { } // 摘要:获取或设置一个值,该值指定是否对正在被序列化的字段或属性的默认值进行序列化。 // 返回结果:如果应该在序列化流中生成成员的默认值,则为 true;否则为 false。 默认值为 true。 public bool EmitDefaultValue { get; set; } // 摘要:获取或设置一个值,该值用于指示序列化引擎在读取或反序列化时成员必须存在。 // 返回结果:如果该成员是必需的,则为 true;否则为 false。 // 异常:System.Runtime.Serialization.SerializationException:该成员不存在。 public bool IsRequired { get; set; } // 摘要:获取或设置数据成员名称。 // 返回结果:该数据成员的名称。 默认值是应用该属性的目标的名称。 public string Name { get; set; } // 摘要:获取或设置成员的序列化和反序列化的顺序。 // 返回结果:序列化或反序列化的数字顺序。 public int Order { get; set; } } }

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧