标签: xml-serialization

XmlSerializer:字符串''不是有效的AllXsd值

我收到此消息,"字符串'7/22/2006 12:00:00 AM'不是有效的AllXsd值.",在反序列化XML时,该元素包含一个日期,这是所谓的属性要映射到元素:

[XmlElement("FEC_INICIO_REL",typeof(DateTime))]
public DateTime? FechaInicioRelacion { get; set; }
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

更新:这是XML:

<Detalle>
  <NOM_ASOC>Financiera Panameña</NOM_ASOC>
  <DESCR_CORTA_RELA>PREST. PERSONAL</DESCR_CORTA_RELA>
  <FEC_INICIO_REL>7/22/2006 12:00:00 AM</FEC_INICIO_REL>
  <FEC_FIN_REL>9/22/2008 12:00:00 AM</FEC_FIN_REL>
  <MONTO_ORIGINAL>1160.0000</MONTO_ORIGINAL>
  <NUM_PAGOS>2</NUM_PAGOS>
  <DESCR_FORMA_PAGO>PAGOS VOLUNTARIOS</DESCR_FORMA_PAGO>
  <IMPORTE_PAGO>59.9400</IMPORTE_PAGO>
  <FEC_ULTIMO_PAGO>11/15/2006 12:00:00 AM</FEC_ULTIMO_PAGO>
  <MONTO_ULTIMO_PAGO>0.0000</MONTO_ULTIMO_PAGO>
  <DESCR_OBS_CORTA />
  <SALDO_ACTUAL>1078.3900</SALDO_ACTUAL>
  <NUM_DIAS_ATRASO>0</NUM_DIAS_ATRASO>
  <HISTORIA>1</HISTORIA>
  <MONTO_CODIFICADO />
  <FEC_ACTUALIZACION>10/17/2008 12:00:00 AM</FEC_ACTUALIZACION>
  <COD_GRUPO_ECON>  </COD_GRUPO_ECON>
  <TIPO_ASOC>  </TIPO_ASOC>
  <NUM_REFER>2008628116</NUM_REFER>
</Detalle>
Run Code Online (Sandbox Code Playgroud)

.net c# xml-serialization

21
推荐指数
2
解决办法
5万
查看次数

XmlSerializer和System.Drawing.Color的最佳解决方案

System.Drawing.Color对象显然不会使用XmlSerializer进行序列化.xml序列化颜色的最佳方法是什么?

.net xml-serialization

20
推荐指数
3
解决办法
1万
查看次数

没有<?xml>文本声明的.NET XML序列化

我正在尝试生成这样的XML:

<?xml version="1.0"?>
<!DOCTYPE APIRequest SYSTEM
"https://url">
<APIRequest>
  <Head>
      <Key>123</Key>
  </Head>
  <ObjectClass>
    <Field>Value</Field
  </ObjectClass>
</APIRequest>
Run Code Online (Sandbox Code Playgroud)

我有一个用XMLSerialization属性装饰的类(ObjectClass),如下所示:

[XmlRoot("ObjectClass")]
public class ObjectClass
{
    [XmlElement("Field")]
    public string Field { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而我真正的hacky直觉思想让我的工作就是在序列化时这样做:

ObjectClass inst = new ObjectClass();
XmlSerializer serializer = new XmlSerializer(inst.GetType(), "");

StringWriter w = new StringWriter();
w.WriteLine(@"<?xml version=""1.0""?>");
w.WriteLine("<!DOCTYPE APIRequest SYSTEM");
w.WriteLine(@"""https://url"">");
w.WriteLine("<APIRequest>");
w.WriteLine("<Head>");
w.WriteLine(@"<Field>Value</Field>");
w.WriteLine(@"</Head>");

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", ""); 
serializer.Serialize(w, inst, ns);

w.WriteLine("</APIRequest>");
Run Code Online (Sandbox Code Playgroud)

但是,这会生成如下XML:

<?xml version="1.0"?>
<!DOCTYPE APIRequest SYSTEM
"https://url">
<APIRequest>
  <Head>
      <Key>123</Key>
  </Head>
  <?xml …
Run Code Online (Sandbox Code Playgroud)

.net xml-serialization .net-2.0

20
推荐指数
2
解决办法
3万
查看次数

我应该使这个XmlSerializer静态吗?

我有一个XmlSerializer在其Read/WriteXml方法中使用的类.目前是Serializer private readonly.

public class Foo : IXmlSerializable
{
    private Bar _bar = new Bar();
    private readonly XmlSerializer serBar = new XmlSerializer (typeof (Bar));

    public void WriteXml (XmlWriter writer)
    {
        serBar.Serialize (writer, Bar);
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑private static改为使用Serializer ,因此所有Foos之间共享一个实例.这是个好主意,还是有可能存在问题?

c# static instance xml-serialization

20
推荐指数
3
解决办法
6651
查看次数

无法序列化成员....因为它是一个接口

我一直有这个问题,一直把头发拉过来.我有以下错误:

异常详细信息:System.NotSupportedException:无法序列化类型为System.Collections.Generic.IList`1 [[HannaPrintsDataAccess.CustomerAddress,HannaPrintsDataAccess,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]的成员HannaPrintsDataAccess.Customer.CustomerAddresses,因为它是一个界面.

来源错误:

第196行:客户客户= OperationsManager.Instance.CustomerService.GetCustomer(7); 第197行:第198行:字符串xml = OperationsManager.Instance.CustomerService.GetCustomerAddressesXml(CustomerAddress.FindAll()); 第199行:第200行:订单订单= OperationsManager.Instance.OrderService.CreateOrderFromCart(xml);

源文件:c:\ HostingSpaces\greetwus\galadavetiye.com\wwwroot\HannaPrints\HannaPrints\WebUI\CreateGreetingCard.aspx.cs行:198

堆栈跟踪:

[NotSupportedException:无法序列化类型System.Collections.Generic.IList`1 [[HannaPrintsDataAccess.CustomerAddress,HannaPrintsDataAccess,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]的成员HannaPrintsDataAccess.Customer.CustomerAddresses,因为它是一个接口]

[InvalidOperationException:无法序列化'System.Collections.Generic.IList`1 [[HannaPrintsDataAccess.CustomerAddress,HannaPrintsDataAccess,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'类型的成员'HannaPrintsDataAccess.Customer.CustomerAddresses',有关更多详细信息,请参阅内部异常.] System.Xml.Serialization.StructModel.CheckSupportedMember(TypeDesc typeDesc,MemberInfo成员,类型类型)+889917 System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo propertyInfo)+132 ...... ..

我已经将我的所有IList更改为List's以查看它是否可以执行任何操作,但事实上,在进行这些更改之后它甚至没有花费一秒钟加载,我猜测因为错误甚至在它到达该部分之前发生.我检查了我的远程文件,看它是否正确上传,确实如此.

这是代码:

using System;
using System.Collections.Generic; 
using Castle.ActiveRecord;
namespace HannaPrintsDataAccess { 
    public partial class Customer { 
        private IList _customerAddresses;


        public CustomerAddress GetPrimaryCustomerAddress()
        {
            foreach (CustomerAddress address in _customerAddresses)
            {
                if (address.IsPrimary)
                    return address;
            }
            return null;
        }


        [HasMany(typeof(CustomerAddress), …
Run Code Online (Sandbox Code Playgroud)

c# xml-serialization

20
推荐指数
1
解决办法
3万
查看次数

如何XML序列化字典

我已经能够以这种方式序列化IEnumerable:

[XmlArray("TRANSACTIONS")]
[XmlArrayItem("TRANSACTION", typeof(Record))]
public IEnumerable<BudgetRecord> Records
{
    get 
    {
        foreach(Record br in _budget)
        {
            yield return br;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我意识到现在我需要一个包含集合的字典Dictionary<string, RecordCollection>(RecordCollection实现IEnumerable).

我怎样才能做到这一点?

.net c# xml-serialization xmlserializer

20
推荐指数
4
解决办法
6万
查看次数

如何在使用XmlSerializer时添加换行符

我想知道如何在使用XmlSerializer时为每个元素添加换行符?

示例代码:

XmlSerializer serializer = new XmlSerializer(typeof(xxx));
using (XmlWriter xmlWriter = XmlWriter.Create("test.xml")
{
    serializer.Serialize(xmlWriter, xxx);
}
Run Code Online (Sandbox Code Playgroud)

.net c# xml xml-serialization

20
推荐指数
2
解决办法
1万
查看次数

如何在不事先知道类型的情况下使用XmlSerializer反序列化可能是基类或派生类的对象?

在C#中,如何在不XmlSerializer事先知道类型的情况下使用an 反序列化可能是基类的对象,或者反序列化任何几个派生类?

我的所有派生类都添加了其他数据成员.我已经制作了一个简单的GUI,可以序列化和反序列化类对象.它将序列化对象,因为任何继承的类(甚至只是基类)都适合于用户选择填充的字段.

我对序列化没有任何问题; 问题是反序列化.如何XmlSerializer在不事先知道类的情况下将反序列化数据传递给正确的派生类?我目前创建一个XmlReader读取XML文件的第一个节点并从中确定类,它似乎适用于我的目的,但它似乎是一个非常不优雅的解决方案.

我在下面发布了一些示例代码.有什么建议?

BaseType objectOfConcern = new BaseType();
XmlSerializer xserializer;
XmlTextReader xtextreader = new XmlTextReader(DEFAULT_FILENAME);

do { xtextreader.Read(); } while (xtextreader.NodeType != XmlNodeType.Element);

string objectType = xtextreader.Name;
xtextreader.Close();

FileStream fstream = new FileStream(DEFAULT_FILENAME, FileMode.Open);

switch (objectType)
    {
case "type1":
    xserializer = new XmlSerializer(typeof(DerivedType));

    objectOfConcern = (DerivedType)xserializer.Deserialize(fstream);

    //Load fields specific to that derived type here
    whatever = (objectOfConcern as DerivedType).NoOfstreamubordinates.ToString();

    case "xxx_1":
        //code here

    case "xxx_2":
        //code here

    case "xxx_n":
        //code here …
Run Code Online (Sandbox Code Playgroud)

c# xml-serialization derived-class xml-deserialization

20
推荐指数
3
解决办法
2万
查看次数

使用XmlSerializer时如何在XML文件中写注释?

我有一个对象Foo,我将其序列化为XML流.

public class Foo {
  // The application version, NOT the file version!
  public string Version {get;set;}
  public string Name {get;set;}
}

Foo foo = new Foo { Version = "1.0", Name = "Bar" };
XmlSerializer xmlSerializer = new XmlSerializer(foo.GetType());
Run Code Online (Sandbox Code Playgroud)

这可以快速,轻松地完成当前所需的一切.

我遇到的问题是我需要维护一个单独的文档文件,其中包含一些小的评论.如上例所示,Name很明显,但是Version应用程序版本而不是数据文件版本,正如人们在这种情况下所期望的那样.而且我还有许多类似的小事我想用评论来澄清.

我知道如果我使用该WriteComment()函数手动创建我的XML文件,我可以这样做,但是我可以实现可能的属性或替代语法,以便我可以继续使用序列化程序功能吗?

.net c# xml xml-serialization xmlserializer

20
推荐指数
2
解决办法
1万
查看次数

Linq to Xml VS XmlSerializer VS DataContractSerializer

在我看来web method,我得到了一些第三方C#实体类的对象.实体类只不过是DataContract.这个实体类非常复杂,具有各种类型的属性,一些属性也是集合.当然,这些链接类型也是DataContracts.

我想将该DataContract实体序列化为XML,作为我的Web服务的业务逻辑的一部分.我不能DataContractSerializer直接使用(在我在web方法中收到的对象),因为XML模式完全不同. 因此,DataContractSerializer生成的XML不会针对模式进行验证.

我无法总结出我应该遵循的方法来实施.我可以想到以下实施方法:

  1. LINQ to XML - 这看起来不错,但我需要为每种类型的对象手动创建XML树(即类实例的元素或XML表示).由于有许多实体类并且它们彼此链接,我认为手动编写XML元素太多了.此外,当实体类引入一些新属性时,我将不得不继续修改XML树.不仅如此,我生成XML树的代码看起来有点笨拙(至少在外观上)并且将来很难被其他开发人员维护/更改; 他/她将不得不仔细研究它以了解如何生成XML.

  2. XmlSerializer - 我可以编写自己的实体类来表示我想要的XML结构.现在,我需要将传入对象的详细信息复制到我自己的类的对象中.所以这是额外的工作(对于.NET,当代码执行时也是如此!).然后我可以XmlSerializer在我的对象上使用生成XML.在这种情况下,我将不得不创建实体类,每当第三方实体被修改时,我只需要在我的类中添加新属性.(使用XmlElement或XmlAttibute属性).但人们推荐DataContractSerializer这个,所以我不想最终确定这个,除非我清楚所有方面.

  3. DataContractSerializer - 再次在这里,我将不得不编写自己的实体类,因为我无法控制第三方DataContracts.我需要将传入对象的细节复制到我自己的类的对象中.所以这是额外的工作.但是,由于DataContractSerializer不支持Xml属性,因此我必须IXmlSerializableWriteXml方法中实现并生成所需的Xml .DataContractSerializer比XmlSerializer更快,但如果第三方实体发生变化,我将不得不处理更改(在WriteXml中).

问题:

  • 考虑到性能,在这种情况下哪种方法最好?
  • 你能建议一些更好的方法吗?
  • 当传入的实体类可能发生变化时,是否DataContractSerializer值得考虑(因为它具有更好的性能XmlSerilaizer)?
  • LINQ应该真的用于序列化吗?或者除了查询之外的其他内容真的有用吗?
  • 在这种情况下,XmlSerializer可以优于LINQ吗?如果是,为什么?

serialization xml-serialization .net-4.0 linq-to-xml datacontractserializer

20
推荐指数
2
解决办法
6473
查看次数