【问题标题】:PubNub JSON serialization code works in example project but not in my projectPubNub JSON 序列化代码在示例项目中有效,但在我的项目中无效
【发布时间】: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


【解决方案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 插件副本通信的最佳方法。

【讨论】:

  • 为什么原类的成员是不可序列化的?
  • 我仍然希望得到答案:)
【解决方案2】:

好吧,我的“解决方案”,因为我只使用一个类(在 Sharpamp 库中定义的 Song 类)来发布值,因此手动构造一个 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 结构)。

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

【讨论】:

  • 你为什么要转义 JSON?为什么不只是传递一个 JSON 对象?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 2014-01-31
  • 1970-01-01
相关资源
最近更新 更多