我有一个或多或少像这样的结构:
[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?
我想生成一个序列化程序集或 .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 文件?
我正在创建一个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中的一个错误,现在已经解决了.请参阅以下讨论以获取错误报告的链接
我正在使用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的功能?
谢谢.
您好我正在预订应用程序,我需要在创建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
¤cyCode=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) 是否可以通过任何配置选项告诉 JavaScriptXMLSerializer不要将空标签折叠为自闭合标签?我将一个 xml 字符串输入到 xml 解析器中,然后在对树进行修改后重新序列化它,但是在输入中有一个显式结束标记的地方,它在输出中折叠为一个自结束标记,这会导致问题。
javascript xmlhttprequest xmlserializer internet-explorer-11
下面的例子给了我“[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(不是我生成的)。根标签可能有不同的名称,我必须将它们映射到不同的类。
附注。我知道有很多这样的问题。我已经研究过它们,但我的问题仍然没有解决。
我在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) 我有一个从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?旧程序会忽略未知元素,但会将它们写回文件中,以免新程序丢失.
我正在尝试序列化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) xmlserializer ×10
c# ×6
.net ×2
javascript ×2
xml ×2
android ×1
constructor ×1
datacontract ×1
generics ×1
html5 ×1
list ×1
struct ×1
svg ×1
wcf ×1
xsd ×1