【问题标题】:XmlSerializer differs between .NET 3.5 & CF.NET 3.5XmlSerializer 在 .NET 3.5 和 CF.NET 3.5 之间有所不同
【发布时间】:2011-06-10 11:41:42
【问题描述】:

我有一个在 CF.NET 和 .NET 下运行的库,但两者的序列化不同。结果,在CF.NET下生成的XML文件在.NET下是不可读的,这对我来说是个大问题!

这里是代码示例:

[Serializable, XmlRoot("config")]
public sealed class RemoteHost : IEquatable<RemoteHost>
{
    // ...
}

public class Program
{
    public static void Main()
    {
        RemoteHost host = new RemoteHost("A");
        List<RemoteHost> hosts = new List<RemoteHost>();
        hosts.Add(host);
        XmlSerializer ser = new XmlSerializer(typeof(List<RemoteHost>));
        ser.Serialize(Console.Out, hosts);
    }
}

CF.NET xml:

<?xml version="1.0"?>
<ArrayOfConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <config Name="A">
  </config>
</ArrayOfConfig>

.NET xml

<?xml version="1.0" encoding="ibm850"?>
<ArrayOfRemoteHost xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <RemoteHost Name="A">
  </RemoteHost>
</ArrayOfRemoteHost>

如何修改我的程序以生成相同的 XML?

【问题讨论】:

    标签: c# .net xml serialization compact-framework


    【解决方案1】:

    确实,它看起来像是处理根名称的错误。解决方法:手动控制根目录:

    [XmlRoot("foo")]
    public class MyRoot {
        [XmlElement("bar")]
        public List<RemoteHost> Hosts {get;set;}
    }
    

    这应该序列化为

    <foo><bar>...</bar>...</foo>
    

    在任一平台上。将 foobar 替换为您的首选名称。

    (我个人会使用二进制输出,不过 ;p)

    【讨论】:

    • Arghhhhhh...这样做我需要重组我所有的商业模式...二进制输出?
    • @Arnaud - 只是在序列化点添加一个包装器并不能真正改变整个模型。
    猜你喜欢
    • 2011-04-15
    • 2010-09-07
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2013-10-05
    • 2011-04-20
    相关资源
    最近更新 更多