我慢慢地感觉到我的理智在边缘磨损,而我的思绪慢慢消失.
我想扩展XmlSerializer,由于某种原因它不支持反序列化通知.
我有以下代码:
public class NotificationXmlSerializer : XmlSerializer
{
public NotificationXmlSerializer(Type type)
: base(type)
{
}
protected override object Deserialize(XmlSerializationReader reader)
{
var x = base.Deserialize(reader);
var methods = x.GetType().GetMethods().Where(method => method.GetCustomAttributes(true).Any(attr => attr is OnDeserializedAttribute));
return x;
}
}
Run Code Online (Sandbox Code Playgroud)
并以这种方式使用它:
using (MemoryStream fs = new MemoryStream())
{
var x = new NotificationXmlSerializer(typeof(int));
x.Serialize(fs, 5);
fs.Seek(0, SeekOrigin.Begin);
var y = x.Deserialize(fs);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在我的Deserialize覆盖中放置一个断点,它永远不会被击中!即使我故意在那里抛出异常,程序功能也是正常的,所以我相信它永远不会被击中.
为什么他们会让我覆盖一个内部方法Deserialize而不会让我影响它的任何东西?
我究竟做错了什么?
最好的问候,马克斯
鉴于此XML:
<Items>
<Item>a</Item>
<Item>b</Item>
</Items>
Run Code Online (Sandbox Code Playgroud)
如何使用反序列化XmlSerializer?要么成为某种自定义类型的数组,要么只是成为一个string[].
我知道如果最里面的标签被称为"字符串",我可以这样做,但我想保留一个自定义名称.
我似乎无法找到对此的明确回应,这让我发疯.XmlSerializer类似乎适用于任何已定义的内容,甚至适用于嵌套类.但是当其中一个类包含System.Object时,它就会呕吐.有没有人知道这方面的简单方法?
namespace test
{
public class SomeList
{
public object obj;
}
public class Person
{
public string first;
public string last;
}
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Creating object...");
Person me = new Person();
me.first = "MyFirst";
me.last = "MyLast";
Console.WriteLine("- Serialized: " + serialize_xml<Person>(me));
Console.WriteLine("");
Console.WriteLine("Creating object with embedded generic...");
SomeList test = new SomeList();
test.obj = me;
Console.WriteLine("- Serialized: " + serialize_xml<SomeList>(test));
Console.WriteLine("");
Console.Write("Press ENTER to exit.");
Console.ReadLine();
return;
}
catch (Exception …Run Code Online (Sandbox Code Playgroud) 我有一个对象,我想序列化它。我想将命名空间添加到 xml 文档的特定元素。我从 1 个默认 xml 创建了多个 .xsd 文件。我使用 XmlSerializer。
命名空间应该在<sos:element. 这就是我想要的:
<env:root
xmls:env ="httpenv"
xmlns:sos="httpsos">
<env:body>
<sos:element
xmlns:abc="" <--------------my namespaces are located in <sos:element
...
Run Code Online (Sandbox Code Playgroud)
如果我使用类似的东西
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("abc", "httpabc");
ns.add....
StringWriter stringWriter = new StringWriter();
serializer.Serialize(stringWriter, ObjectToSerialize, ns);
Run Code Online (Sandbox Code Playgroud)
我将得到以下内容
<env:root
xmls:env ="httpenv"
xmlns:sos="httpsos"
xmlns:abc="" <-------------I do not want it here; I want it in <sos:element
<env:body>
<sos:element>
...
Run Code Online (Sandbox Code Playgroud)
有没有办法指定我想要在哪里(在哪个元素中)声明我的命名空间,或者它们都在根元素中声明?
我遇到了一个工厂类,如果我想替换下面的XmlSerializer代码,我不完全确定如何使用它.
样本模型
public class SampleData
{
public string Name { get; set; }
public string Country { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现有守则
List<SampleData> objects = new List<SampleData>();
objects.Add(new SampleData() { Country = "Australia", Name = "aus" });
StringWriter writer = new StringWriter();
XmlSerializer serializer = new XmlSerializer(typeof(List<SampleData>));
serializer.Serialize(writer, objects);
Run Code Online (Sandbox Code Playgroud)
工厂类
public static class CachingXmlSerializerFactory
{
private static readonly Dictionary<string, XmlSerializer> Cache = new Dictionary<string, XmlSerializer>();
private static readonly object SyncRoot = new object();
public static XmlSerializer …Run Code Online (Sandbox Code Playgroud) 我尝试使用 XMLSerializer 生成如下所示的 XML,其中 的内容<create>是一个数组,但元素可以是不同的类型(在本例中<vendor>为<customer>、 和<asset>)。这可能吗?
...
<create>
<vendor>
<vendorid>Unit - A-1212</vendorid>
<name>this is the name8</name>
<vcf_bill_siteid3>FOOBAR8</vcf_bill_siteid3>
</vendor>
<customer>
<CUSTOMERID>XML121</CUSTOMERID>
<NAME>XML Customer 111</NAME>
</customer>
<asset>
<createdAt>San Jose</createdAt>
<createdBy>Kevin</createdBy>
<serial_number>123456789</serial_number>
</asset>
</create>
....
Run Code Online (Sandbox Code Playgroud) 我想根据架构 (XSD) 创建一个 XML 文件。我在 StackOverflow 上发现了这个问题:使用 XSD 文件生成 XML 文件
它适用于像这样的简单示例:
var data = new ProfileType();
data.Name = "Test";
data.Address = "Street";
var serializer = new XmlSerializer(typeof(ProfileType));
using (var stream = new StreamWriter("D:\\test.xml")) serializer.Serialize(stream, data);
Run Code Online (Sandbox Code Playgroud)
但是如何将更多的类/类型添加到同一个 xml 文件中?如果我在下面添加这些代码行,它们会覆盖 text.xml 文件:
var data2 = new MemberType();
data2.Age = "25";
data2.Code = "Z14x";
data2.Color = "Red":
var serializer2 = new XmlSerializer(typeof(MemberType));
using (var stream = new StreamWriter("D:\\test.xml")) serializer2.Serialize(stream, data2);
Run Code Online (Sandbox Code Playgroud) 我有一个名为SomeRule可以以 XML 格式序列化的类。该类使用ISomeService我想通过 autofac 注入的 。
[Serializable]
public class SomeRule
{
[XmlAttribute("Attribute1")]
public string Attribute1 {get;set;}
[XmlAttribute("Attribute2")]
public string Attribute2 { get; set; }
private readonly ISomeService m_someService;
private SomeRule()
{
}
public SomeRule(ISomeService someService)
{
m_someService = someService;
}
public void DoSomething()
{
m_someService.DoStuff(Attribute1);
}
}
public interface ISomeService {
void DoStuff(string param);
}
public class SomeServiceImpl : ISomeService
{
public void DoStuff(string param)
{
// Do something with the stuff.
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我的程序接收到一个我想要反序列化的 XML …
我收到错误“{”类型 Device1 不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。"}"
目前我有:
public abstract class Device
{
..
}
public class Device1 : Device
{ ... }
[Serializable()]
public class DeviceCollection : CollectionBase
{ ... }
[XmlRoot(ElementName = "Devices")]
public class XMLDevicesContainer
{
private DeviceCollection _deviceElement = new DeviceCollection();
/// <summary>Devices device collection xml element.</summary>
[XmlArrayItem("Device", typeof(Device))]
[XmlArray("Devices")]
public DeviceCollection Devices
{
get
{
return _deviceElement;
}
set
{
_deviceElement = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在做:
XMLDevicesContainer devices = new XMLDevicesContainer();
Device device = …Run Code Online (Sandbox Code Playgroud) 致力于XML序列化.序列化枚举类型时,要更改它的xml元素名称.任何帮助,将不胜感激.
我使用.Net xml序列化来序列化这个对象,并产生下面的xml输出
<MyEnums> <MyEnum>One</MyEnum> <MyEnum>Two</MyEnum> <MyEnum>Three</MyEnum></MyEnums>
Run Code Online (Sandbox Code Playgroud)
这是班级
public class Request
{
public List<MyEnum> MyEnums { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我想要发出的XML
<MyEnums>
<ModifiedElementName>One</ModifiedElementName>
<ModifiedElementName>Two</ModifiedElementName>
<ModifiedElementName>Three</ModifiedElementName>
Run Code Online (Sandbox Code Playgroud)
这是Enum Type
enum MyEnum
{
One,
Two,
Three
}
Run Code Online (Sandbox Code Playgroud)
期望输出为xml
<ModifiedElementName>One</ModifiedElementName>
Run Code Online (Sandbox Code Playgroud)