HTTP 経由で再生中の曲の詳細を Web ページに送信する単一の機能を持つ Winamp プラグインを作成しています。
これは次のように機能します: Winamp の曲イベントがトリガーされます -> 新しい曲をチェックします -> PubNub (C# API) を使用して Web ページに公開します。
これまでのところ、JSON に公開するために渡すオブジェクトをシリアル化しない PubNub コードを除いて、すべてが想定どおりに機能する段階に達しました。PubNub コンソールに表示されるのは{}
、空の JSON オブジェクトだけです。
プロジェクト構造の背景:
C# で Winamp プラグインを作成できるカスタム ライブラリであるSharpampを使用しています。PubNub C# APIも使用しています。gen_notifier_cs プロジェクトは、Sharpamp によって作成された C++ プラグイン ラッパーです。notifier_cs は、すべてのコードが存在する場所です。他の 2 つのプロジェクトは自明だと思います。私は 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の publish メソッド内でシリアル化を行うコードです。このコードは、PubNub のサンプル ファイルでは機能しますが、私のプロジェクトでは機能しないことを思い出してください。
DataContractJsonSerializer serializer = new DataContractJsonSerializer(objectToSerialize.GetType());
serializer.WriteObject(ms, objectToSerialize);
ms.Position = 0;
using (StreamReader reader = new StreamReader(ms))
{
return reader.ReadToEnd();
}
私は最後の日のために髪を引っ張っています。この投稿が非常に長いことは承知していますが、ご意見をお寄せいただきありがとうございます。