我正在制作一个 Winamp 插件,它具有将通过 HTTP 播放的歌曲的详细信息发送到网页的单一功能。
它的工作原理如下:触发 Winamp 歌曲事件 -> 检查新歌曲 -> 使用PubNub (C# API) 发布到网页。
到目前为止,我已经到了一切都按预期工作的阶段,除了PubNub 代码不序列化我传递的对象以发布到 JSON。我在 PubNub 控制台中得到的只是{}
一个空的 JSON 对象。
项目结构的一点背景:
我正在使用Sharpamp,它是一个自定义库,可以使用 C# 制作 Winamp 插件。我也在使用PubNub C# API。gen_notifier_cs 项目是 Sharpamp 创建的 C++ 插件包装器。notifier_cs 是我所有代码所在的位置。我认为另外两个项目是不言自明的。我在 notifier_cs 中引用了 PubNub API,并且在 notifier_cs 和 PubNub API 中也引用了 Sharpamp。
因此,需要序列化的对象属于Song
Sharpamp 中定义的类:
public class Song
{
public string Title { get; internal set; }
public string Artist { get; internal set; }
public string Album { get; internal set; }
public string Year { get; internal set; }
public bool HasMetadata { get; internal set; }
public string Filename { get; internal set; }
}
所以假设我有一个song
包含歌曲数据的对象,我会去pubnub.publish("winamp_pipe", song);
发布它,PubNub 会自动将数据序列化为 JSON。但这在我的解决方案中不起作用。
为了测试它为什么不序列化,我将该类复制到PubNub API 中的示例代码文件中。Visual Studio 将类更改为此(注意 public Song() 方法):
public class Song
{
public Song() // VS added this method
{
return; // I added this otherwise it would not compile
}
public string Album { get; set; }
public string Artist { get; set; }
public string Filename { get; set; }
public bool HasMetadata { get; set; }
public string Title { get; set; }
public string Year { get; set; }
}
在同一个示例文件中,我使用一些值启动了一个默认歌曲对象:
Song song = new Song();
song.Album = "albumname";
song.Artist = "artistname";
song.HasMetadata = true;
song.Title = "songtitle";
song.Year = "2012";
并发表了它:pubnub.publish("winamp_pipe", song);
它奏效了!我在 PubNub 频道中获得了 JSON 对象!
{"Album":"albumname","Artist":"artistname","Filename":null,"HasMetadata":true,"Title":"songtitle","Year":"2012"}
Song
因此,我尝试用Sharpamp 中定义的原始类替换“新”类。我尝试在 notifier_cs 项目中添加另一个类定义,但这与我必须依赖的 Sharpamp 中的类定义发生冲突。我一直在尝试很多事情,只要我能想到。不用说,没有一个占上风。尽管如此,我得到的只是一个空的 JSON 对象。
这是在PubNub API的发布方法中进行序列化的代码。我会提醒您此代码适用于 PubNub 示例文件,但不适用于我的项目:
DataContractJsonSerializer serializer = new DataContractJsonSerializer(objectToSerialize.GetType());
serializer.WriteObject(ms, objectToSerialize);
ms.Position = 0;
using (StreamReader reader = new StreamReader(ms))
{
return reader.ReadToEnd();
}
最后一天我一直在拔头发。我知道这篇文章很长,但我仍然感谢您的意见。