标签: xmlserializer

XML序列化 - 何时使用DataContractSerializer/Binary/XMLSerialiser

我已经看了一会儿了

似乎不鼓励使用二进制序列化,因为对字段名称的任何更改都会破坏序列化=?不好

XMLSerializer是有问题的,因为您必须提供无参数构造函数和公共字段,尽管您可以更多地控制元素属性或元素及其命名

DataContractSerializer很好,但需要明确添加所有的分类,这是一种耻辱

但是我偶然发现NetDataContractSerializer没有这个限制.

如果你的目标是C#序列化并且对xml的大小没有很大的限制,那么NetDataContractSerializer总是可以去这里吗?

c# datacontractserializer xmlserializer

5
推荐指数
1
解决办法
5939
查看次数

如何在c#中的List <SomeStruct>()中覆盖每个列表项的序列化名称?

我有一个或多或少像这样的结构:

[Serializable]
[XmlRoot("Customer")]
public struct TCustomer
{
  string CustomerNo;
  string Name;
}
Run Code Online (Sandbox Code Playgroud)

我有时将此结构序列化为XML作为单个对象,它工作正常,但我有时也需要序列化此结构的List <>.

我用它来设置顶级元素名称:

[Serializable]
[XmlRoot("Customers")]
public class CustomerList : List<TCustomer> { }
Run Code Online (Sandbox Code Playgroud)

但是,XmlSerializer坚持要调用每个列表项TCustomer.如何告诉XmlSerializer使用Customer而不是TCustomer?

c# generics struct list xmlserializer

5
推荐指数
3
解决办法
6481
查看次数

使用 XmlAttributeOverrides 时,如何以编程方式生成像 XmlSerializer 这样的序列化程序集或 cs 文件?

我想生成一个序列化程序集或 .cs 文件来使用 XmlAttributeOverrides 序列化我的类型,然后直接在我的项目中引用这个程序集/.cs 文件而不是使用 XmlSerializer 来执行 xml 序列化/反序列化。这是因为序列化使用 XmlAttributeOverrides,并且当您创建具有覆盖的 XmlSerializer 时,它不会查找现有程序集,但会始终重新生成一个程序集(参考)。我的程序在无法运行 csc.exe 的环境中运行,因此我无法在运行时生成序列化程序集。

需要明确的是,我不能只使用 sgen.exe,因为它只会生成执行默认 xml 序列化/反序列化的程序集。如果您创建一个 XmlSerializer 并在构造函数中传递它 XmlAttributeOverrides则 Serialize() 和 Deserialize() 不使用由 sgen.exe 生成的程序集,因此 sgen.exe 对我来说似乎没有用。使用覆盖时 XmlSerializer 将始终生成新程序集。

那么,有没有一种方法可以调用 XmlSerializer 或其他类并让它创建一个可以包含在我的项目中的 .cs 文件或 dll?如果可能的话,我想自动化这个过程,这样我就不需要在更改正在序列化的类型时进行手动更改。我不能使用 sgen.exe /k 因为它只为一种类型生成默认的 XmlSerializer 而不是我需要的使用覆盖的类型。是否有另一种方法来生成或捕获由 XmlSerializer 创建的 .cs 文件?

(我在这里有一个相关的问题这是这个问题的根源)

.net c# xml-serialization xmlserializer

5
推荐指数
1
解决办法
2663
查看次数

xmlserializer从xlink:html svg图像标记中剥离xlink

我正在创建一个javascript界面​​,以便将xlinked图像动态添加到教室地图中.

 //declare the xlink namespace in the svg header
 xmlns:xlink="http://www.w3.org/1999/xlink"
...
//the code to append the image
var temp = document.createElementNS(svgns,"image");
temp.setAttributeNS(null,"x","0");
temp.setAttributeNS(null,"y","0");
temp.setAttributeNS(null,"height","80");
temp.setAttributeNS(null,"width","40");
temp.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href","roomlayouts/items/ cactus.svg");
Run Code Online (Sandbox Code Playgroud)

图像附加并在屏幕上显示如下标签:

<image x="0" y="0" height="80" width="40" xlink:href="roomlayouts/items/cactus.svg"></image>
Run Code Online (Sandbox Code Playgroud)

但是一旦我通过xmlserializer传递它以便我可以保存文件,它会从前面剥离xlink标记:

var svgDoc = document.getElementById('SVGMap');
var serializer = new XMLSerializer();
var xmlString = serializer.serializeToString(svgDoc.firstChild);
Run Code Online (Sandbox Code Playgroud)

创建:

<image x="0" y="0" width="40" height="80" href="roomlayouts/items/cactus.svg"></image>
Run Code Online (Sandbox Code Playgroud)

这意味着svg失去了cactii.有什么想法我怎么能让xmlserializer保持xlink前缀?

==============================注意:这是webkit中的一个错误,现在已经解决了.请参阅以下讨论以获取错误报告的链接

javascript html5 svg xmlserializer

5
推荐指数
1
解决办法
2971
查看次数

XmlSerializer - 必需的元素

我正在使用XmlSerializer进行WCF服务(在我的服务中有这样的理由).但是最近我遇到了这个问题:我找不到一个简单的方法来创建一个引用类型属性,即让它在XSD中的定义如下所示:

<xs:element minOccurs="1" maxOccurs="1" name="Name" type="xs:string"/>
Run Code Online (Sandbox Code Playgroud)

而不是这个:

<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string"/>
Run Code Online (Sandbox Code Playgroud)

这是属性的代码:

[XmlElement]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

我知道使用DataContractSerializer我可以这样做:

[DataMember(IsRequired = true)]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

我会得到所需的架构.

任何想法如何使用XmlSerializer属性获得类似于IsRequired的功能?

谢谢.

.net wcf xsd xmlserializer

5
推荐指数
1
解决办法
2348
查看次数

XmlSerializer - 反序列化枚举时如何设置默认值?

我有一个看起来像这样的类(大大简化):

public class Foo
{
    public enum Value
    {
        ValueOne,
        ValueTwo
    }

    [XmlAttribute]
    public Value Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我从外部源接收 XML 文件。他们的文档指出,Foo 元素的 Bar 属性中只会有“ValueOne”或“ValueTwo”(他们不提供 XSD)。

所以,我像这样反序列化它:

 var serializer = new XmlSerializer(typeof(Foo));
 var xml = "<Foo Bar=\"ValueTwo\" />";
 var reader = new StringReader(xml);

 var foo = (Foo)serializer.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud)

...这一切都有效。

然而,昨晚,他们向我发送了一些如下所示的 XML 而我的反序列化失败了(理应如此):<Foo Bar="" />

有没有一种好的方法可以围绕这个进行防御性编码?理想情况下,我想说“如果这里出现问题,默认为 ValueOne”。我不想丢弃整个 XML 文件,因为单个属性被破坏了。

c# defensive-programming xml-serialization xmlserializer

5
推荐指数
1
解决办法
3666
查看次数

强制 XMLSerializer 不折叠空标签?

是否可以通过任何配置选项告诉 JavaScriptXMLSerializer不要将空标签折叠为自闭合标签?我将一个 xml 字符串输入到 xml 解析器中,然后在对树进行修改后重新序列化它,但是在输入中有一个显式结束标记的地方,它在输出中折叠为一个自结束标记,这会导致问题。

javascript xmlhttprequest xmlserializer internet-explorer-11

5
推荐指数
1
解决办法
1024
查看次数

前缀 SOAP XML 而不是直接命名空间

我正在与我们的一位合作伙伴合作整合我们的业务服务。我正在使用 WCF (.Net 3.5) 与合作伙伴 Web 服务进行通信。我认为合作伙伴 Web 服务是用 Java 编写的。

使用 SVC util 我生成了代理类。svcutil 使用 xmlserializer 代替 DataContract 序列化器。但合作伙伴提供的 WSDL 与 Web 服务响应 SOAP xml 不匹配。由于合作伙伴对更改 wsdl 不感兴趣,因此我手动更改了下载的 WSDL 以匹配响应。该问题已得到解决。

现在我遇到了不同的问题。当我向网络服务发送请求时,它总是失败。然后我使用 fiddler 将 SOAP 请求转发给合作伙伴。合作伙伴表示,请求发送的 xml 命名空间未针对其系统进行验证。他们还回复了示例 SOAP 请求。

通过比较这两个请求,命名空间看起来是正确的。但是合作伙伴 xml 使用前缀来定义命名空间,并且元素都带有前缀。而我们这边的 xml 没有前缀,而是直接在父元素中使用命名空间。

这是我们发送的 XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <iL21stCentRq xmlns="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing">
        <ACORD xmlns="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing">
            <SignonRq xmlns="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/">
                <SignonPswd>
                    <CustId>
                        <SPName>111</SPName>
                    </CustId>
                </SignonPswd>
            </SignonRq>
        </ACORD>
    </iL21stCentRq>
</s:Body>
Run Code Online (Sandbox Code Playgroud)

这是合作伙伴期望我们提供的示例 XML

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stc="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing" xmlns:stc1="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing" xmlns:acd="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/">
<soapenv:Header/>
<soapenv:Body>
    <stc:iL21stCentRq>
        <stc:input>
            <stc1:ACORD>
                <acd:SignonRq> …
Run Code Online (Sandbox Code Playgroud)

wcf namespaces xml-serialization xmlserializer

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

在(反)序列化树中使用自己的XmlSerializer将已知类型的列表传递给对象

我在microsoft .net 3.5(VS2008)上使用C#3.我有反序列化的问题.我在我想要序列化的类层次结构中使用DataContract和DataMember.

但是,我在一个容器中也有多态,所以我需要将已知类型的列表传递给序列化器.我的收藏是一个可在网上找到的可序列化词典:

[Serializable]
[XmlRoot("dictionary")]
public class SerializableSortedDictionary<TKey, TVal>
    : SortedDictionary<TKey, TVal>, IXmlSerializable
{
    #region Constants
    private const string DictionaryNodeName = "Dictionary";
    private const string ItemNodeName = "Item";
    private const string KeyNodeName = "Key";
    private const string ValueNodeName = "Value";
    #endregion

    #region Constructors
    public SerializableSortedDictionary()
    {
    }

    public SerializableSortedDictionary(IDictionary<TKey, TVal> dictionary)
    : base(dictionary)
    {
    }

    public SerializableSortedDictionary(IComparer<TKey> comparer)
    : base(comparer)
    {
    }

    public SerializableSortedDictionary(IDictionary<TKey, TVal> dictionary, IComparer<TKey> comparer)
    : base(dictionary, comparer)
    {
    }

    #endregion

    #region IXmlSerializable Members

    void IXmlSerializable.WriteXml(System.Xml.XmlWriter …
Run Code Online (Sandbox Code Playgroud)

c# constructor datacontract xmlserializer deserialization

5
推荐指数
1
解决办法
2294
查看次数

序列化为XML时重命名类

我正在尝试序列化Outer下面显示的类,并XElement从序列化的XML 创建一个.它有一个类型的财产Inner.我想更改Inner(to Inner_X)和Outer(to Outer_X)的名称.

class Program
{
    static void Main(string[] args)
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            using (TextWriter streamWriter = new StreamWriter(memoryStream))
            {
                var xmlSerializer = new XmlSerializer(typeof(Outer));

                xmlSerializer.Serialize(streamWriter,  new Outer());

                XElement result = XElement.Parse(Encoding.ASCII.GetString(memoryStream.ToArray()));
            }
        }
    }
}

[XmlType("Outer_X")]
public class Outer
{
    public Outer()
    {
        this.InnerItem = new Inner();
    }

    public Inner InnerItem { get; set; }
}

[XmlType("Inner_X")]
public class Inner
{ …
Run Code Online (Sandbox Code Playgroud)

c# xml-serialization xmlserializer

5
推荐指数
1
解决办法
2358
查看次数