紧凑框架3.5上的Xml序列化问题

时间:2009-08-29 21:41:22

标签: c# serialization compact-framework xml-serialization

我正在做手指练习并尝试编写一个应用程序,让我的电脑和Windows手机通过蓝牙通过串口进行通信。

现在我遇到了对象序列化的障碍。 .Net Compact Framework不支持二进制分区,因此我选择XmlSerialization。我写了一个包含两个类的库。一个ObjectCarrier应该能够包含其他类,所以我可以有一个通用的发送和接收方式。并有一个服装类MusicAlbum。

整个设置在PC端完美运行。移动网站一直给我以下错误: System.InvalidOperationException:生成XML文档时出错。 ---> System.InvalidOperationException:不期望TransferObject.MusicAlbum类型。使用XmlInclude或SoapInclude属性指定静态未知的类型。

奇怪的是,如果我使用ObjectCarrier并在Payload中放置类似字符串或日期时间对象的东西,它就适用于移动设备。

我的MusicAlbum课程出了什么问题?

--- | MusicListing.cs | -------------

using System;
using System.Collections.Generic;
using System.Text;

namespace TransferObject
{
    public class MusicAlbum
    {
        public string AlbumName { get; set; }
        public string ArtistName { get; set; }
    }

}

--- | TransferObject.cs | -----------

using System;
using System.Xml.Serialization;

namespace TransferObject
{
    [XmlInclude(typeof(MusicAlbum))]
    public class ObjectCarrier
    {
        public Object PayloadObject { get; set; }
    }

}

谢谢你的建议。这有助于我了解我是如何做到的。通过使用抽象类,我不再需要载体了。

它不工作的原因是我自己的错,它是一个Windows库而不是移动库。更改后,您的代码完美运行。就我现在测试的双方而言。如果有任何变化,我会更新。

1 个答案:

答案 0 :(得分:1)

据我了解,XmlInclude用于子类;即如果MusicAlbum继承自ObjectCarrier,并且您正在将MusicAlbum个实例序列化为ObjectCarrier

IMO,这里最好的方法是使用每种类型的消息;但是,如果您想要使用[XmlInclude]路由,则可以为所有支持的有效负载定义公共基类,例如:

[XmlInclude(typeof(MusicAlbum))] // etc other types...
public abstract class PayloadBase {}

public class MusicAlbum : PayloadBase
{
    public string AlbumName { get; set; }
    public string ArtistName { get; set; }
}

public class ObjectCarrier
{
    public PayloadBase PayloadObject { get; set; }
}

顺便说一句,有些API支持CF上的二进制文件; protobuf-net只是一个(我作为作者有偏见 - 但是嘿,它是免费的......)。