我的应用程序使用XmlSerializer保存一个类,然后在需要时通过再次反序列化来创建一个实例.我想在我的构造函数逻辑中使用我的类的一些属性成员(在反序列化期间分配).可以假设首先分配属性,并且一旦分配了所有属性,就会调用构造函数吗?
继续讨论这个主题,是否有关于反序列化过程中发生的事件序列的文档?
我正在使用Simple XML库来处理Android应用程序中的XML文件.这些文件可以变得非常大 - 大约1Mb,并且可以非常深入地嵌套,因此它们相当复杂.
当应用程序通过Simple API加载其中一个文件时,最多可能需要30秒才能完成.目前我正在将FileInputStream传递给Simple的Persister类的[read(Class,InputStream)] [2]方法.实际上,它只读取XML节点并将数据映射到模型对象的实例,从而在内存中复制XML树结构.
我的问题是如何改善Android的性能?我目前的想法是将文件的内容读入字节数组,并将ByteArrayInputStream传递给Persister的read方法.我想处理文件的时间会更快,但我不确定节省的时间是否会被首先读取整个文件所花费的时间所抵消.内存限制也可能是一个问题.
这是傻瓜差事吗?在这种情况下,我还能做些什么来提高性能吗?如果不是,我将不得不求助于改进用户对加载文件的进度的反馈.
一些警告:
1)我无法更改我正在使用的XML库 - 有问题的代码是在桌面,移动和Web应用程序中使用的"引擎"的一部分.改变它的开销对于时间来说太过分了.
2)数据文件由用户创建,因此我无法控制嵌套的大小/深度.
我正在尝试将一些XML从Web服务反序列化为C#POCO.我已经将这个工作用于我需要的大多数属性,但是,我需要根据元素是否存在来设置bool属性,但似乎无法看到如何执行此操作?
一个示例XML片段:
<someThing test="true">
<someThingElse>1</someThingElse>
<target/>
</someThing>
Run Code Online (Sandbox Code Playgroud)
一个示例C#类:
[Serializable, XmlRoot("someThing")]
public class Something
{
[XmlAttribute("test")]
public bool Test { get; set; }
[XmlElement("someThingElse")]
public int Else { get; set; }
/// <summary>
/// <c>true</c> if target element is present,
/// otherwise, <c>false</c>.
/// </summary>
[XmlElement("target")]
public bool Target { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我正在处理的实际XML和对象层次结构的一个非常简化的示例,但演示了我正在尝试实现的内容.
我读过的与反序列化null/empty元素相关的所有其他问题似乎都涉及到使用Nullable<T>,而这并不是我需要的.
有没有人有任何想法?
我有下一个XML文件:
<Root>
<Document>
<Id>d639a54f-baca-11e1-8067-001fd09b1dfd</Id>
<Balance>-24145</Balance>
</Document>
<Document>
<Id>e3b3b4cd-bb8e-11e1-8067-001fd09b1dfd</Id>
<Balance>0.28</Balance>
</Document>
</Root>
Run Code Online (Sandbox Code Playgroud)
我把它反序列化到这个类:
[XmlRoot("Root", IsNullable = false)]
public class DocBalanceCollection
{
[XmlElement("Document")]
public List<DocBalanceItem> DocsBalanceItems = new List<DocBalanceItem>();
}
Run Code Online (Sandbox Code Playgroud)
在哪里DocBalanceItem:
public class DocBalanceItem
{
[XmlElement("Id")]
public Guid DocId { get; set; }
[XmlElement("Balance")]
public decimal? BalanceAmount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的反序列化方法:
public DocBalanceCollection DeserializeDocBalances(string filePath)
{
var docBalanceCollection = new DocBalanceCollection();
if (File.Exists(filePath))
{
var serializer = new XmlSerializer(docBalanceCollection.GetType());
TextReader reader = new StreamReader(filePath);
docBalanceCollection = (DocBalanceCollection)serializer.Deserialize(reader);
reader.Close(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试反序列化以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<XGResponse><Failure code="400">
Message id '1' was already submitted.
</Failure></XGResponse>
Run Code Online (Sandbox Code Playgroud)
通过这个电话:
[...]
var x = SerializationHelper.Deserialize<XMLGateResponse.XGResponse>(nResp);
[...]
public static T Deserialize<T>(string xml)
{
using (var str = new StringReader(xml))
{
var xmlSerializer = new XmlSerializer(typeof(T));
return (T)xmlSerializer.Deserialize(str);
}
}
Run Code Online (Sandbox Code Playgroud)
获取相应类的实例:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18052
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------ …Run Code Online (Sandbox Code Playgroud) 以前,序列化/反序列化方法使用以下类型Item:
public class Item{}
Run Code Online (Sandbox Code Playgroud)
现在我有了一个名为ItemWrapperderived from Itemwith new property 的新类:
public class ItemWrapper : Item
{
public string NewProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我的序列化/反序列化方法使用该类型ItemWrapper.现在我已经破坏了向后兼容性.我无法加载任何Item在旧版本中保存的类型的XML文件.我认为应该在反序列化方法使用try/catch当它试图反序列化Item的ItemWrapper,然后在抓我会再尝试反序列化的Item.或者我可以通过xPath查看XML结构,如果没有ItemWrapper找到,我可以将其视为Item.这两种解决方案都让人感觉很烦,而且我确信有更好的方法来处理这种情况.有任何想法吗?
c# xml serialization backwards-compatibility xml-deserialization
我正在尝试Movie从"德语"xml字符串反序列化对象:
string inputString = "<?xml version=\"1.0\"?>"
+ "<movie title=\"Great Bollywood Stuff\">"
+ "<rating>5</rating>"
+ "<price>1,99</price>" // <-- Price with German decimal separator!
+ "</movie>";
XmlSerializer movieSerializer = new XmlSerializer(typeof(Movie));
Movie inputMovie;
using (StringReader sr = new StringReader(inputString))
{
inputMovie = (Movie)movieSerializer.Deserialize(sr);
}
System.Console.WriteLine(inputMovie);
Run Code Online (Sandbox Code Playgroud)
这里的Movie课程供参考:
[XmlRoot("movie")]
public class Movie
{
[XmlAttribute("title")]
public string Title { get; set; }
[XmlElement("rating")]
public int Rating { get; set; }
[XmlElement("price")]
public double Price { get; set; }
public Movie()
{ …Run Code Online (Sandbox Code Playgroud) 我正在学习Servicestack.Text库,因为它具有一些最好的功能.我正在尝试将XML反序列化为我的一个DTO,如下所示;
C#代码: [与控制台应用程序相关的代码]
class Program
{
static void Main(string[] args)
{
string str = "http://static.cricinfo.com/rss/livescores.xml";
WebClient w = new WebClient();
string xml = w.DownloadString(str);
Response rss = xml.FromXml<Response>();
foreach (var item in rss.rss.Channel.item)
{
Console.WriteLine(item.title);
}
Console.Read();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在str[程序中的给定]中查看XML文件.我为反序列化准备了DTO.它们如下:
public class Response
{
public RSS rss { get; set; }
}
public class RSS
{
public string Version { get; set; }
public ChannelClass Channel { get; set; }
}
public class ChannelClass
{
public …Run Code Online (Sandbox Code Playgroud) 我有一个.Net webserivce接受XML字符串格式.XML发送到webserivce的字符串可以表示系统中的任何Object.我需要检查第一个节点,找出反序列化XML字符串的对象.为此,我将不得不将XML加载到XMLDocument(不想使用RegEx或字符串比较).我想知道是否有一种方法来反序列化XMLDocument/XMLNode而不是反序列化字符串以节省一些性能?序列化XMLNode字符串会不会有任何性能优势?
加载XMLDocument的方法
public void LoadFromString(String s)
{
m_XmlDoc = new XmlDocument();
m_XmlDoc.LoadXml(s);
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我创建了一个API包装类库,用于从第三方使用rest API.
直到他们最近在他们的产品的最新版本中更新API并且在根元素中添加了命名空间,现在我的反序列化代码失败了.
我的一个课程的一个例子:
[Serializable]
[XmlRootAttribute(ElementName = "exit_survey_list")]
public class SupportExitSurveyCollection : ApiResult { .... }
Run Code Online (Sandbox Code Playgroud)
如果我将XmlRootAttribute中的Namespace属性设置为要返回的新命名空间,那么它将再次正常工作.
但我需要支持两个版本的API(命名空间而不是命名空间),因为我无法确定哪个版本的API可用.
我想让这个工作没有重复不同版本的类,但不确定是否可能.
感谢您的任何意见/建议.
c# ×9
xml ×6
.net ×3
android ×1
generics ×1
java ×1
localization ×1
namespaces ×1
servicestack ×1
web-services ×1