4

我正在制作一个 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。

因此,需要序列化的对象属于SongSharpamp 中定义的类:

    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();
}

最后一天我一直在拔头发。我知道这篇文章很长,但我仍然感谢您的意见。

4

2 回答 2

1

发布数据:PubNub 和 C# Winamp 歌曲类

您已经将数据存储在winamp_song对象实例中。如果您尝试序列化winamp_song对象实例,它将失败。如果您传入 ,则序列化将失败,winamp_song因为实例具有不可序列化的成员。最好的方法是让您创建一个Song class您拥有和定义的。Song class定义将通过 PubNub 传递的成员值。这样,您可以直接填充发布给订阅者所需的值。

Song song = new Song();
song.Album = winamp_song.Album;
song.Artist = winamp_song.Artis;
song.HasMetadata = winamp_song.HasMetadata;
song.Title = winamp_song.Title;
song.Year = winamp_song.Year;

当您甚至在订阅者上收到 Song 数据发布时,您将能够接收反序列化数据,将值填充到新Song class实例中。

下面定义的歌曲类

public class Song {
    public Song() { return; }
    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; }
}

PubNub 是与已安装的 Winamp 插件副本进行通信的最佳方法。

于 2012-09-15T21:14:32.677 回答
0

好吧,我的“解决方案”,因为我只使用一个类(Song该类,在 Sharpamp 库中定义)来发布值,是手动构造一个 JSON 字符串:

pubnub.publish("winamp_pipe", "{\"Album\": \""+song.Album+"\",\"Artist\": \""+song.Artist+"\",\"HasMetadata\": \""+song.HasMetadata.ToString()+"\",\"Title\": \""+song.Title+"\",\"Year\": \""+song.Year+"\",\"Filename\": \""+song.Filename+"\"}");

它不是问题本身的解决方案,但它的目的是将信息作为 JSON 对象发布(只要您没有任何特殊字符会破坏数据中的 JSON 结构)。

我没有将此标记为答案,因为它不是真正问题的解决方案,只是一种临时解决方法......

于 2012-09-18T15:10:07.520 回答