使用C#.NET 2.0,我有一个复合数据类,它具有该[Serializable]属性.我正在创建一个XMLSerializer类并将其传递给构造函数:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Run Code Online (Sandbox Code Playgroud)
我得到一个例外说:
有一个反映类型的错误.
在数据类内部还有另一个复合对象.这是否还需要具有该[Serializable]属性,或者将其置于顶层对象上,是否以递归方式将其应用于内部的所有对象?
在C#中,您可以使用implicit关键字来定义隐式的用户定义类型转换运算符.
在VB.NET中,您可以定义一个CType转换运算符,它将用户定义的类型显式转换为另一种类型.
有没有办法在VB.NET中声明隐式转换运算符?
我似乎无法找到关于此的任何信息....
我在Widening运营商的MSDN文档中找到了我的答案.显然,CType Widening运算符被"调用"用于隐式转换,而CType Narrowing运算符被调用用于显式转换.
起初,我认为这个文档不正确,因为我在测试期间遇到了异常.我重新测试并发现一些非常奇怪的东西.当使用"="运算符完成隐式转换时,我实现为扩展转换运算符的函数工作正常.
例如,以下内容将隐式地将Something类型转换为MyClass.它Widening正确调用我的转换实现,一切正常,没有错误:
Dim y As Something
Dim x As MyClass = y
Run Code Online (Sandbox Code Playgroud)
但是,如果隐式转换是在foreach循环中完成的,则它不起作用.
例如,当在循环中隐式转换类型时,以下代码将抛出异常(" 无法将'Something'类型的对象强制转换为'MyClass' "):SomethingMyClassFor Each
Dim anArrayOfSomethingTypes() As Something = getArrayOfSomethings()
For Each x As MyType In anArrayOfSomethingTypes
....
Next
Run Code Online (Sandbox Code Playgroud)
我们非常感谢您对此的任何见解.
继我最近关于大型复杂对象作为Web服务结果的问题之后.我一直在考虑如何确保所有未来的子类都可以序列化为XML.
现在,显然我可以实现IXmlSerializable接口然后读取它的读者/写入器,但我想避免它,因为它意味着我需要在我想要的时候实例化读写器,并且99.99%的时间我将使用字符串,所以我可能只写自己的字符串.
但是,要序列化为XML,我只是用Xml来装饰类及其成员??? 属性(XmlRoot,XmlElement等),然后将其传递给XmlSerializer和StringWriter以获取字符串.这一切都很好.我打算把方法返回到一个通用的实用工具方法,所以我不需要担心类型等.
我担心的是:如果我没有使用必需的属性装饰类,则在运行时才会抛出错误.
有没有办法强制执行属性修饰?可以用FxCop完成吗?(我还没用过FxCop)
很抱歉让这个关闭的人有很多关闭,很多事要做!
绝对喜欢在测试用例中使用反射来实现它的想法,而不是诉诸于FxCop(喜欢把所有东西放在一起).. Fredrik Kalseth的答案很棒,感谢包含代码,因为它可能会让我有点挖掘弄清楚自己该怎么做!
+1给其他人类似的建议:)
基础项目包含一个抽象基类Foo.在单独的客户端项目中,有一些实现该基类的类.
我想通过调用基类上的一些方法来序列化和恢复具体类的实例:
// In the base project:
public abstract class Foo
{
abstract void Save (string path);
abstract Foo Load (string path);
}
Run Code Online (Sandbox Code Playgroud)
可以假设在反序列化时,存在所有需要的类.如果可能的话,序列化应该用XML完成.使基类实现IXmlSerializable是可能的.
我有点卡在这里.如果我对事物的理解是正确的,那么这只能通过[XmlInclude(typeof(UnknownClass))]为每个实现类添加一个基类来实现 - 但实现类是未知的!
有没有办法做到这一点?我没有反思的经验,但我也欢迎使用它的答案.
编辑:问题是De序列化.只是序列化会很容易.:-)
我应该从Web服务公开强类型数据集并将其直接绑定在客户端吗?或者是否有更合理的方式来提供asmx Web服务?我正在做CRUD操作(创建,读取,更新,删除).
我发现使用数据集是令人沮丧的,例如在插入其中的表时很难处理.当仅插入一条记录或仅从数据集中的特定表中获取一条记录时,将整个数据集来回传送似乎不合逻辑.
有没有更好的办法?
我是应该转换为对象并通过Web服务使用对象?在整个地方进行转换以获得传递的对象可能同样乏味?
我试图弄清楚如何使用XmlSerializer序列化任何类,而不使用XmlInclude属性。一般有效,但使用以下代码我得到一个例外:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Xml.Serialization;
namespace Test
{
public class ReactObject { }
public class ReactListObject : ReactObject { }
public class ReactList<T> : ReactObject, ICollection, IList<T>
{
public ReactList() { }
public virtual void AddRange(IEnumerable<T> values) { }
[XmlArray(ElementName = "Items", IsNullable = false)]
public T[] Items
{
get { lock (SyncRoot) { return (ItemsList.ToArray()); } }
set { lock (SyncRoot) { ItemsList = new …Run Code Online (Sandbox Code Playgroud) 我有一个里面object {System.Collections.Generic.List<object>}包含 1000 个object {DynamicData},每个有 4 个键和值,另一个List有 2 个键和值。我需要将这个对象序列化为一个 XML 文件,我尝试了正常的序列化,但它给了我这个异常 = The type DynamicData was not expected,我如何序列化这个对象?
这是代码:
//output is the name of my object
XmlSerializer xsSubmit = new XmlSerializer(output.GetType());
var xml = "";
using (var sww = new StringWriter())
{
using (XmlWriter writers = XmlWriter.Create(sww))
{
try
{
xsSubmit.Serialize(writers, output);
}
catch (Exception ex)
{
throw;
}
xml = sww.ToString(); // Your XML
}
}
Run Code Online (Sandbox Code Playgroud)
我可以逐行和逐个元素地创建 xml 文件,但我想要更快、更少代码的东西。我的对象的结构是这样的:
output (count 1000) …Run Code Online (Sandbox Code Playgroud) 我有一个属性定义为:
[XmlArray("delete", IsNullable = true)]
[XmlArrayItem("contact", typeof(ContactEvent)),
XmlArrayItem("sms", typeof(SmsEvent))]
public List<Event> Delete { get; set; }
Run Code Online (Sandbox Code Playgroud)
如果List <> Delete没有项目
<delete />
Run Code Online (Sandbox Code Playgroud)
发出.如果List <> Delete设置为null
<delete xsi:nil="true" />
Run Code Online (Sandbox Code Playgroud)
发出.有没有办法使用属性来获取如果集合没有项目不发出删除元素?
格雷格 - 非常感谢,我甚至没有读过IsNullable文档,只是假设它发出了不需要的信号.
Rob Cooper - 我试图避免使用ISerializable,但Gregs建议有效.我确实碰到了你在(1)中概述的问题,如果集合长度为零,我只是返回null而破坏了一堆代码.为了解决这个问题,我创建了一个EventsBuilder类(我正在序列化的类称为Events),它管理Events类的底层对象的所有生命周期/创建,这些对象吐出我们的Events类以进行序列化.
我仍然试图围绕整个xml序列化事物包围我的脑子,看起来我又需要一些帮助了.
我需要能够反序列化抽象类型的属性.这种类型将随着时间的推移而添加许多不同的具体类型,并且在许多不同的模型中被引用,因此明确列出每种具体类型并不是理想的解决方案.
我已经阅读了XML Serialization和Inherited Types线程,并提出了以下内容:
<Page>
<introCommand>
<PlayElement />
</introCommand>
</Page>
Run Code Online (Sandbox Code Playgroud)
**
namespace TestService
{
public class Page
{
[XmlElement("introCommand", Type = typeof(XmlCommandSerializer<AbstractCommandModel>))]
//[XmlElement(typeof(PlayElement))] **NOTE: the example works if I use this instead
public AbstractCommandModel introCommand;
}
}
Run Code Online (Sandbox Code Playgroud)
**
namespace TestService
{
public class AbstractCommandModel
{
}
}
Run Code Online (Sandbox Code Playgroud)
**
namespace TestService
{
public class PlayElement : AbstractCommandModel
{
}
}
Run Code Online (Sandbox Code Playgroud)
**
namespace TestService
{
public class XmlCommandSerializer<AbstractCommandModel> : IXmlSerializable
{
// Override the Implicit Conversions Since the XmlSerializer …Run Code Online (Sandbox Code Playgroud)