我已经在这个上浪费了几个小时:
XmlSerializer serializer;
Run Code Online (Sandbox Code Playgroud)
是的,就在using那里,引用就在那里,我使用.NET 4.0在VS2010中制作了整个解决方案,所以它不是那些东西.如果我进入对象资源管理器,我可以XmlSerializer在正确的命名空间中找到我想要的类但是如果我尝试在我的代码文件中键入上面的行并编译我得到了可怕的
找不到类型或命名空间名称"XmlSerializer"(您是否缺少using指令或程序集引用?)
死亡警告.我也没有在IntelliSense上得到它.我看过的所有其他主题/网站都是空白的,或者我已经排除了其中一个解决方案.我错过了什么?干杯
我经常读到BinaryFormatter比XmlSerializer具有更好的性能.出于好奇,我写了一个测试应用程序.
一个wtf时刻......为什么Xml比Bin快得多(特别是反序列化)?
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace SerPlayground
{
class Program
{
static void Main(string[] args)
{
var items = new List<TestClass>();
for (int i = 0; i < 1E6; i++)
{
items.Add(new TestClass() { Name = i.ToString(), Id = i });
}
File.Delete("test.bin");
using (var target = new FileStream("test.bin", FileMode.OpenOrCreate))
{
System.Threading.Thread.Sleep(1000);
var bin = new BinaryFormatter();
var start = DateTime.Now;
bin.Serialize(target, items);
Console.WriteLine("Bin: {0}", (DateTime.Now - start).TotalMilliseconds);
target.Position = 0; …Run Code Online (Sandbox Code Playgroud) 概括
.NET Core 应用程序无法 XML 序列化包含枚举值的对象,而 .NET Framework (4.7.2) 成功。这是一个已知的重大更改,如果是,我该如何解决?
代码示例
以下控制台应用程序不会在 .NET Framework 4.7.2 项目中引发异常:
public enum MyEnum
{
One,
}
public class ValueContainer
{
public object Value;
}
class Program
{
static void Main(string[] args)
{
XmlSerializer newSerializer = XmlSerializer.FromTypes(
new[] { typeof(ValueContainer)})[0];
var instance = new ValueContainer();
instance.Value = MyEnum.One;
using (var memoryStream = new MemoryStream())
{
newSerializer.Serialize(memoryStream, instance);
}
}
}
Run Code Online (Sandbox Code Playgroud)
.NET Core 3.0 控制台应用程序中完全相同的代码在调用时抛出以下异常Serialize:
System.InvalidOperationException
HResult=0x80131509
Message=There was an error generating the XML …Run Code Online (Sandbox Code Playgroud) 我想像这样使用XML序列化:
class Foo {
public Foo (string name) {
Name1 = name;
Name2 = name;
}
[XmlInclude]
public string Name1 { get; private set; }
[XmlInclude]
private string Name2;
}
StreamWriter wr = new StreamWriter("path.xml");
new XmlSerializer<Foo>().Serialize (wr, new Foo ("me"));
Run Code Online (Sandbox Code Playgroud)
编辑:我知道这段代码错了.这只是为了展示我想如何使用它.
但这根本不起作用:
我错过了什么,XmlSerializer实际上提供了所描述的可能性吗?是否有替代的XML序列化程序可以更复杂地处理这些情况?
如果不是:我们毕竟是在2010年,.NET已存在多年.通常使用XML序列化,完全标准化,并且应该非常容易执行.或者我的理解可能是错误的,XML序列化不应该有充分的理由暴露所描述的功能?
编辑:遗产不是一个很好的理由imo.List起初也是非通用的.
(随意调整标题或标签.如果这应该是CW,请只需删除一个注释.)
有没有办法在PowerShell中利用.NET的XmlSerializer类的功能?
更具体地说,能够轻松地将.NET类型/序列化为Xml,例如
XmlSerializer s = new XmlSerializer(typeof(MyType));
TextReader r = new StreamReader("sample.xml");
MyType myType = (MyType)s.Deserialize(r);
r.Close();
Run Code Online (Sandbox Code Playgroud)
我知道我可以从PowerShell上面调用,但有没有办法避免在单独的程序集中定义MyType?谢谢
[编辑]由于似乎无法从PowerShell添加类似.NET的类型,请允许我重新定位我的问题:是否有一种简单的方法,如XmlSerializer,在PowerShell中序列化类型?我必须从PS读取/写入一些.xml,并且宁愿在手动执行之前利用这些功能.
这是一个非常疯狂的bug.以下是OutOfMemoryException针对非常简短(例如<ABC def='123'/>)的XML snippit 抛出的内容:
public static T DeserializeXmlNode<T>(XmlNode node)
{
try
{
return (T)new XmlSerializer(typeof(T))
.Deserialize(new XmlNodeReader(node));
}
catch (Exception ex)
{
throw; // just for catching a breakpoint.
}
}
Run Code Online (Sandbox Code Playgroud)
我在这篇MSDN文章中读到,如果我在构造函数中使用XmlSerializer和其他参数,我每次调用时都会生成未缓存的序列化程序集,从而导致程序集泄漏.但我没有在构造函数中使用其他参数.它也是在第一次在新启动的AppDomain中调用时发生的,所以这也没有意义.
是什么赋予了?
将一些xml反序列化为C#中的对象时遇到问题.
我收到的错误是......
xmlns=''> was not expected.
Run Code Online (Sandbox Code Playgroud)
我收到的用于生成课程的XSD如下......
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="xml.AAAAAAA.com/commerce/apres-vente_technique/assistance" xmlns:pgp="xml.AAAAAAA.com/commerce/apres-vente_technique/assistance" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="ListeAvisRemboursements">
<xs:annotation>
<xs:documentation>Liste des avis de remboursements</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="AvisRemboursement" type="pgp:AvisRemboursementType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="AvisRemboursementType">
<xs:annotation>
<xs:documentation>Avis de remboursement lié à une DC</xs:documentation>
</xs:annotation>
<xs:sequence>
Run Code Online (Sandbox Code Playgroud)
(剪断)
我尝试导入的文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<ListeAvisRemboursements xmlns:ast="xml.AAAAAAA.com/commerce/apres-vente_technique/assistance">
<ast:AvisRemboursement NumeroDT="3826961" CodeRA="020545G01" NumeroDC="1">
<ast:DateTraitement>2010-06-22</ast:DateTraitement>
<ast:MontantDC>25.0</ast:MontantDC>
<ast:MontantMO>0.0</ast:MontantMO>
<ast:SommeAD>25.0</ast:SommeAD>
<ast:MontantPR>0.0</ast:MontantPR>
<ast:SommePR>0.0</ast:SommePR>
<ast:FraisGestion>0.0</ast:FraisGestion>
<ast:NombreHeuresTotalRemboursees>0</ast:NombreHeuresTotalRemboursees>
<ast:Etat>C</ast:Etat>
<ast:NoteCredit>319984</ast:NoteCredit>
<ast:Imputation>030</ast:Imputation>
<ast:ListInterventionsPR/>
<ast:ListInterventionsMO/>
</ast:AvisRemboursement>
Run Code Online (Sandbox Code Playgroud)
(剪断)
我认为正在发生的事情是,当.Net试图对xml进行去磁化时,它会触及包含"xmlns:ast"的第一行并对其进行投诉.据我所知,.Net将尝试将属性映射到目标类中的公共属性(并且它不会找到一个名为xmlns.或者我如何处理名称空间有问题.
我的反序列化代码如下所示:
XmlDocument _Doc = new …Run Code Online (Sandbox Code Playgroud) 我希望xml编码为:
<?xml version="1.0" encoding="windows-1252"?>
Run Code Online (Sandbox Code Playgroud)
像encoding="windows-1252"我编写这段代码一样生成编码.
var myns = OS.xmlns;
using (var stringWriter = new StringWriter())
{
var settings = new XmlWriterSettings
{
Encoding = Encoding.GetEncoding(1252),
OmitXmlDeclaration = false
};
using (var writer = XmlWriter.Create(stringWriter, settings))
{
var ns = new XmlSerializerNamespaces();
ns.Add(string.Empty, myns);
var xmlSerializer = new XmlSerializer(OS.GetType(), myns);
xmlSerializer.Serialize(writer, OS,ns);
}
xmlString= stringWriter.ToString();
}
Run Code Online (Sandbox Code Playgroud)
但我仍然没有得到我想要的编码我错过了什么?请指导我生成编码encoding="windows-1252"?.我需要在代码中更改什么?
使ServiceStack xml反序列化工作的最简单方法是xml包含命名空间.但是,我收到的xml不包含名称空间.最简单的工作示例:
[Serializable]
public class test
{
}
class Program
{
static void Main(string[] args)
{
string xml="<test xmlns=\"http://schemas.datacontract.org/2004/07/\"></test>";
var result = ServiceStack.Text.XmlSerializer.DeserializeFromString<test>(xml);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不是我想要的.我希望以下代码反序列化,因为这是我从几个服务获得的xml:
string xml="<test></test>";
Run Code Online (Sandbox Code Playgroud)
但是这给了我以下错误:
DeserializeDataContract: Error converting type: Error in line 1 position 7.
Expecting element 'test' from namespace
'http://schemas.datacontract.org/2004/07/'..
Encountered 'Element' with name 'test', namespace ''.
Run Code Online (Sandbox Code Playgroud)
我试过了:
[Serializable]
[XmlRoot("test", Namespace = "")]
public class test
Run Code Online (Sandbox Code Playgroud)
我无法创建新的Serializer,因为ServiceStack.Text.XmlSerializer是静态的.我需要选择Microsoft XmlSerializer或ServiceStack(不是两者).含义:如果我不能让这个简单的例子工作,我需要跳过ServiceStack包中另一个非常有用的部分.我想要的最后一件事是在传入的xml中注入一些虚拟命名空间.
我想将类序列化为XML,为其分配XML属性.片段:
[XmlType(TypeName = "classmy")]
public class MyClass2 : List<object>
{
[XmlAttribute(AttributeName = "myattr")]
public string Name { get; set; }
}
public class MyConst
{
public MyConst()
{
MyClass2 myClass2 = new MyClass2 { 10, "abc" };
myClass2.Name = "nomm";
XmlSerializer serializer = new XmlSerializer(typeof(MyClass2));
serializer.Serialize(Console.Out, myClass2);
}
}
Run Code Online (Sandbox Code Playgroud)
但是生成的XML看起来像这样
<?xml version="1.0" encoding="IBM437"?>
<classmy xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<anyType xsi:type="xsd:int">10</anyType>
<anyType xsi:type="xsd:string">abc</anyType>
</classmy>
Run Code Online (Sandbox Code Playgroud)
一切都很好,唯一的例外是myClass2.Name没有被序列化.我期待着一些东西
<classmy myattr="nomm" [...]>[...]</classmy>
Run Code Online (Sandbox Code Playgroud)
...为什么不是序列化的,它怎么可能?
xmlserializer ×10
c# ×8
.net ×2
xml ×2
.net-core ×1
namespaces ×1
performance ×1
powershell ×1
servicestack ×1