我想将我的枚举值序列化为int,但我只得到名称.
这是我的(示例)类和枚举:
public class Request {
public RequestType request;
}
public enum RequestType
{
Booking = 1,
Confirmation = 2,
PreBooking = 4,
PreBookingConfirmation = 5,
BookingStatus = 6
}
Run Code Online (Sandbox Code Playgroud)
和代码(只是为了确保我做错了)
Request req = new Request();
req.request = RequestType.Confirmation;
XmlSerializer xml = new XmlSerializer(req.GetType());
StringWriter writer = new StringWriter();
xml.Serialize(writer, req);
textBox1.Text = writer.ToString();
Run Code Online (Sandbox Code Playgroud)
这个答案(对另一个问题)似乎表明枚举应该序列化为默认值,但它似乎并没有这样做.这是我的输出:
<?xml version="1.0" encoding="utf-16"?>
<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<request>Confirmation</request>
</Request>
Run Code Online (Sandbox Code Playgroud)
我已经能够通过在每个值上放置一个"[XmlEnum("X")]"属性来序列化为值,但这似乎是错误的.
我需要得到简单的xml,而不是<?xml version="1.0" encoding="utf-16"?>
在开头和xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
第一个元素中XmlSerializer
.我该怎么做?
我需要一个XML可序列化的字典.实际上,我现在有两个完全不同的程序需要一个.我很惊讶地看到.NET没有.我在其他地方问了这个问题并得到了讽刺的回应.我不明白为什么这是一个愚蠢的问题.
考虑到各种.NET特性对XML序列化的依赖性,有人可以启发我,为什么没有XML可序列化的字典.希望你也可以解释为什么有些人认为这是一个愚蠢的问题.我想我必须遗漏一些基本的东西,我希望你能填补空白.
我是否可以序列化可序列化对象的通用列表,而无需指定其类型.
像下面破坏的代码背后的意图:
List<ISerializable> serializableList = new List<ISerializable>();
XmlSerializer xmlSerializer = new XmlSerializer(serializableList.GetType());
serializableList.Add((ISerializable)PersonList);
using (StreamWriter streamWriter = System.IO.File.CreateText(fileName))
{
xmlSerializer.Serialize(streamWriter, serializableList);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
对于那些想要了解详细信息的人:当我尝试运行此代码时,它在XMLSerializer [...]行上出错:
无法序列化System.Runtime.Serialization.ISerializable接口.
如果我改变List<object>
我得到"There was an error generating the XML document."
.InnerException的细节是"{"The type System.Collections.Generic.List1[[Project1.Person, ConsoleFramework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] may not be used in this context."}"
person对象定义如下:
[XmlRoot("Person")]
public class Person
{
string _firstName = String.Empty;
string _lastName = String.Empty;
private Person()
{
}
public Person(string lastName, string firstName)
{
_lastName = lastName;
_firstName …
Run Code Online (Sandbox Code Playgroud) 我有一些用于某些RESTful服务的XSD架构.当与xsd.exe
工具结合使用以生成C#代码时,XSD会xs:date
生成以下代码:
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
public System.DateTime time {
get {
return this.timeField;
}
set {
this.timeField = value;
}
}
Run Code Online (Sandbox Code Playgroud)
将XML反序列化为使用XmlSerializer
all的对象似乎很好.我面临的问题是服务要求将日期格式化为YYYY-MM-DD hh:mm:ss
,并且XSD生成的代码似乎只生成YYYY-MM-DD
.
如果我手动修改XSD以进行xs:dateTime
输入,则生成的C#代码会产生:2010-08-20T20:07:03.915039Z
.
基本上,我如何强制序列化生成YYYY-MM-DD hh:mm:ss
?是否可以对XSD做些什么或者我可以做些什么来改变生成的C#代码?
此代码生成FileNotFoundException,但最终运行没有问题:
void ReadXml()
{
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
//...
}
Run Code Online (Sandbox Code Playgroud)
这是一个例外:
mscorlib.dll中出现"System.IO.FileNotFoundException"类型的第一次机会异常
附加信息:无法加载文件或程序集"MyAssembly.XmlSerializers,Version = 1.4.3190.15950,Culture = neutral,PublicKeyToken = null"或其依赖项之一.该系统找不到指定的文件.
如果找不到,框架似乎会自动生成序列化程序集. 我可以使用sgen.exe手动生成它,这可以缓解异常.
如何让visual studio自动生成XML序列化程序集?
更新:生成序列化程序集:打开设置似乎没有做任何事情.
我的模式指定了命名空间,但文档没有.在JAXB解组(XML - >对象)期间忽略命名空间的最简单方法是什么?
换句话说,我有
<foo><bar></bar></foo>
Run Code Online (Sandbox Code Playgroud)
代替,
<foo xmlns="http://tempuri.org/"><bar></bar></foo>
Run Code Online (Sandbox Code Playgroud) 请考虑以下Amount值类型属性,该属性标记为可为空的XmlElement:
[XmlElement(IsNullable=true)]
public double? Amount { get ; set ; }
Run Code Online (Sandbox Code Playgroud)
当可空值类型设置为null时,C#XmlSerializer结果如下所示:
<amount xsi:nil="true" />
Run Code Online (Sandbox Code Playgroud)
我希望XmlSerializer能够完全抑制元素,而不是发出这个元素.为什么?我们使用Authorize.NET进行在线支付,如果存在此null元素,Authorize.NET会拒绝该请求.
当前的解决方案/解决方法是根本不序列化Amount值类型属性.相反,我们创建了一个互补属性SerializableAmount,它基于Amount而是序列化的.由于SerializableAmount的类型为String,默认情况下,如果默认为null,则XmlSerializer会抑制类似引用类型的引用类型,一切都很有效.
/// <summary>
/// Gets or sets the amount.
/// </summary>
[XmlIgnore]
public double? Amount { get; set; }
/// <summary>
/// Gets or sets the amount for serialization purposes only.
/// This had to be done because setting value types to null
/// does not prevent them from being included when a class
/// is being serialized. When a nullable value type is …
Run Code Online (Sandbox Code Playgroud) 假设我有一个名为Song的XML可序列化类:
[Serializable]
class Song
{
public string Artist;
public string SongTitle;
}
Run Code Online (Sandbox Code Playgroud)
为了节省空间(并且还对XML文件进行半混淆),我决定重命名xml元素:
[XmlRoot("g")]
class Song
{
[XmlElement("a")]
public string Artist;
[XmlElement("s")]
public string SongTitle;
}
Run Code Online (Sandbox Code Playgroud)
这将生成如下的XML输出:
<Song>
<a>Britney Spears</a>
<s>I Did It Again</s>
</Song>
Run Code Online (Sandbox Code Playgroud)
我想重命名/重新映射类/对象的名称.比如,在上面的例子中,我希望将类Song重命名为g.因此,生成的xml应如下所示:
<g>
<a>Britney Spears</a>
<s>I Did It Again</s>
</g>
Run Code Online (Sandbox Code Playgroud)
是否可以通过xml-attributes重命名类名?
我不希望手动创建/遍历DOM,所以我想知道它是否可以通过装饰器实现.
提前致谢!
更新:哎呀!这次我真的再次做到了!忘了提 - 我实际上是在序列化XML中的Song对象列表.
这是序列化代码:
public static bool SaveSongs(List<Song> songs)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Song>));
using (TextWriter textWriter = new …
Run Code Online (Sandbox Code Playgroud) 我有以下两个功能:
public static string Serialize(object obj)
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
MemoryStream memoryStream = new MemoryStream();
serializer.WriteObject(memoryStream, obj);
return Encoding.UTF8.GetString(memoryStream.GetBuffer());
}
public static object Deserialize(string xml, Type toType)
{
MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
// memoryStream.Position = 0L;
XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
DataContractSerializer dataContractSerializer = new DataContractSerializer(toType);
return dataContractSerializer.ReadObject(reader);
}
Run Code Online (Sandbox Code Playgroud)
第一个似乎将对象序列化为xml字符串就好了.XML显示有效,没有损坏的标记,开头或结尾没有空格等.现在第二个函数不希望将我的xml字符串反序列化回对象.在最后一行我得到:
反序列化[MY OBJECT TYPE HERE]类型的对象时出错.根级别的数据无效.第1行,第1位.
我究竟做错了什么?我尝试重写Deserialize函数几次,它似乎总是出现同样的错误.谢谢!
哦,这就是我调用2个函数的方式:
SomeObject so = new SomeObject();
string temp = SerializationManager.Serialize(so);
so = (SomeObject)SerializationManager.Deserialize(temp, typeof(SomeObject));
Run Code Online (Sandbox Code Playgroud)