【发布时间】:2012-09-15 09:17:09
【问题描述】:
我正在制作一个 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。
因此,需要序列化的对象属于 Sharpamp 中定义的 Song 类:
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 中的 example code file。 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();
}
最后一天我一直在拔头发。我知道这篇文章很长,但我仍然感谢您的意见。
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
谢谢约翰。会记住这一点!
-
嗨皮劳!现在查看您的详细信息。
-
为了让您快速开始工作路径,您可以将字符串值数组推送到列表中,然后使用 ","
comma加入列表。然后发布这个逗号分隔的字符串pubnub.publish("winamp_pipe", "song,title,year"); -
添加的答案 - 请参阅“发布数据:PubNub 和 C# Winamp 歌曲类”
标签: c# json serialization pubnub winamp