4

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

私は最後の日のために髪を引っ張っています。この投稿が非常に長いことは承知していますが、ご意見をお寄せいただきありがとうございます。

4

2 に答える 2

1

データの公開:PubNubおよびC#Winamp Song Class

winamp_songすでにオブジェクトインスタンスにデータが保存されています。winamp_songオブジェクトインスタンスをシリアル化しようとすると、失敗します。winamp_songインスタンスにシリアル化できないメンバーがあるため、を渡すと、シリアル化は失敗します。続行するための最良の方法は、Song class自分が所有して定義するを作成することです。Song classPubNubを介して配信されるメンバー値を定義します。このようにして、サブスクライバーに公開するために必要な値を直接入力できます。

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

さて、私の「解決策」は、1 つのクラス ( SongSharpamp ライブラリで定義されたクラス) のみを使用して値を公開しているため、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 に答える