我正在做手指练习并尝试编写一个应用程序,让我的电脑和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库而不是移动库。更改后,您的代码完美运行。就我现在测试的双方而言。如果有任何变化,我会更新。
答案 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只是一个(我作为作者有偏见 - 但是嘿,它是免费的......)。