标签: xmlserializer

如何在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
查看次数

如何在Android应用程序中使用xmlserializer创建一个xml

您好我正在预订应用程序,我需要在创建xml后将xml发送到服务器.

如何创建xml xmlserializer并在创建后将其发送到服务器?

http://api.ean.com/ean-services/rs/hotel/v3/list?
minorRev=[current minorRev #]
&cid=55505
&apiKey=[xxx-yourOwnKey-xxx]
 &customerUserAgent=[xxx]&customerIpAddress=[xxx]
&locale=en_US
&currencyCode=USD
&xml=
     <HotelListRequest>
<city>Seattle</city>
<stateProvinceCode>WA</stateProvinceCode>
<countryCode>US</countryCode>
<arrivalDate>08/01/2012</arrivalDate>
<departureDate>08/03/2012</departureDate>
<RoomGroup>
  <Room>
    <numberOfAdults>2</numberOfAdults>
  </Room>
</RoomGroup>
<numberOfResults>1</numberOfResults>
     <supplierCacheTolerance>MED_ENHANCED</supplierCacheTolerance>
     </HotelListRequest>
Run Code Online (Sandbox Code Playgroud)

xml android xmlserializer

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

强制 XMLSerializer 不折叠空标签?

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

javascript xmlhttprequest xmlserializer internet-explorer-11

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

使用不同的根元素名称反序列化

下面的例子给了我“[One xmlns=''] 不是预期的。” 例外

public abstract class BaseClass{ }

[XmlRoot("One")]
public class ChildOne : BaseClass {}

[XmlRoot("Two")]
public class ChildTwo : BaseClass { }

class Program
{
    private static void Main(string[] args)
    {
        var ser = new XmlSerializer(typeof (BaseClass), new Type[] {typeof (ChildOne), typeof (ChildTwo)});
        var obj1 = ser.Deserialize(new StringReader(@"<?xml version=""1.0""?><One></One>"));
        var obj2 = ser.Deserialize(new StringReader(@"<?xml version=""1.0""?><Two></Two>"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要反序列化 XML(不是我生成的)。根标签可能有不同的名称,我必须将它们映射到不同的类。

附注。我知道有很多这样的问题。我已经研究过它们,但我的问题仍然没有解决。

c# xml xml-serialization xmlserializer

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

在(反)序列化树中使用自己的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
查看次数

XmlSerializer:保留未知元素

我有一个从XML序列化/反序列化并存储在/从文件中恢复的类:

public class Customer
{
    public string FirstName;
    public string LastName;

    public Customer()
    {
    }

    public Customer(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public static Customer Load(TextReader reader)
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(Customer));
        return (Customer)deserializer.Deserialize(reader);
    }

    public void Save(TextWriter writer)
    {
        XmlSerializer serializer = new XmlSerializer(GetType());
        serializer.Serialize(writer, this);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个类的较新版本中,我添加了一个新属性

public string MiddleName;
Run Code Online (Sandbox Code Playgroud)

用户已经安装了我的程序的旧版本和新版本的常见用例.它们都读取和写入相同的序列化文件.当新版本写到文件中,所有的三个属性(FirstName,LastName,MiddleName)写入.旧程序读取文件但省略了未知元素MiddleName.它没有保存文件MiddleName,因此对于较新的程序它的值会丢失.

在序列化时反序列化和"合并"未知元素时,有没有办法存储原始XML?旧程序会忽略未知元素,但会将它们写回文件中,以免新程序丢失.

c# serialization xmlserializer

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

序列化为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
查看次数