相关疑难解决方法(0)

XmlSerializer - 反映类型时出错

使用C#.NET 2.0,我有一个复合数据类,它具有该[Serializable]属性.我正在创建一个XMLSerializer类并将其传递给构造函数:

XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Run Code Online (Sandbox Code Playgroud)

我得到一个例外说:

有一个反映类型的错误.

在数据类内部还有另一个复合对象.这是否还需要具有该[Serializable]属性,或者将其置于顶层对象上,是否以递归方式将其应用于内部的所有对象?

.net c# xml serialization .net-2.0

326
推荐指数
8
解决办法
23万
查看次数

有没有办法在VB.NET中定义隐式转换运算符?

在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)

我们非常感谢您对此的任何见解.

.net vb.net

26
推荐指数
1
解决办法
1万
查看次数

实施类/方法的属性装饰

继我最近关于大型复杂对象作为Web服务结果的问题之后.我一直在考虑如何确保所有未来的子类都可以序列化为XML.

现在,显然我可以实现IXmlSerializable接口然后读取它的读者/写入器,但我想避免它,因为它意味着我需要在我想要的时候实例化读写器,并且99.99%的时间我将使用字符串,所以我可能只写自己的字符串.

但是,要序列化为XML,我只是用Xml来装饰类及其成员??? 属性(XmlRoot,XmlElement等),然后将其传递给XmlSerializerStringWriter以获取字符串.这一切都很好.我打算把方法返回到一个通用的实用工具方法,所以我不需要担心类型等.

我担心的是:如果我没有使用必需的属性装饰类,则在运行时才会抛出错误.

有没有办法强制执行属性修饰?可以用FxCop完成吗?(我还没用过FxCop)

更新:

很抱歉让这个关闭的人有很多关闭,很多事要做!

绝对喜欢在测试用例中使用反射来实现它的想法,而不是诉诸于FxCop(喜欢把所有东西放在一起).. Fredrik Kalseth的答案很棒,感谢包含代码,因为它可能会让我有点挖掘弄清楚自己该怎么做!

+1给其他人类似的建议:)

c# xml serialization coding-style .net-attributes

16
推荐指数
1
解决办法
4428
查看次数

序列化和恢复未知类

基础项目包含一个抽象基类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序列化.只是序列化会很容易.:-)

c# abstract-class xml-serialization

11
推荐指数
1
解决办法
2万
查看次数

我应该从Web服务返回强类型数据集吗?

我应该从Web服务公开强类型数据集并将其直接绑定在客户端吗?或者是否有更合理的方式来提供asmx Web服务?我正在做CRUD操作(创建,读取,更新,删除).

我发现使用数据集是令人沮丧的,例如在插入其中的表时很难处理.当仅插入一条记录或仅从数据集中的特定表中获取一条记录时,将整个数据集来回传送似乎不合逻辑.

有没有更好的办法?

我是应该转换为对象并通过Web服务使用对象?在整个地方进行转换以获得传递的对象可能同样乏味?

.net data-binding dataset

7
推荐指数
1
解决办法
2551
查看次数

XmlSerializer:“在此上下文中不能使用类型‘Type’”

我试图弄清楚如何使用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)

c# xml-serialization

5
推荐指数
1
解决办法
6601
查看次数

如何将动态对象序列化为 xml c#

我有一个里面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)

c# xml xml-serialization xmlserializer dynamicobject

5
推荐指数
1
解决办法
7709
查看次数

XML序列化和空集合

我有一个属性定义为:

[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类以进行序列化.

c# xml-serialization

3
推荐指数
2
解决办法
1万
查看次数

XML序列化:反序列化抽象属性的问题

我仍然试图围绕整个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)

.net c# xml-serialization

0
推荐指数
1
解决办法
5155
查看次数