Създавам плъгин на Winamp с единствената функция за изпращане на подробности за песента, която се възпроизвежда през HTTP към уеб страница.
Работи по следния начин: задейства се събитие за песен на Winamp -> проверка за нова песен -> публикуване в уеб страница чрез PubNub ( C# API).
Дотук стигнах до етапа, в който всичко работи точно както трябва, с изключение на PubNub кода, който не сериализира обекта, който предавам за публикуване в JSON. Всичко, което продължавам да получавам в конзолата на PubNub, е просто {}
- празен JSON обект.
Малка информация за структурата на проекта:
Използвам Sharpamp, която е персонализирана библиотека, която позволява създаване на добавки за Winamp с C# . Също така използвам PubNub C# API . Проектът gen_notifier_cs е обвивката на приставката C++, създадена от Sharpamp. notifier_cs е мястото, където се намира целият ми код. Предполагам, че другите два проекта се разбират сами. Позовах се на PubNub API в notifier_cs, а също така посочих Sharpamp както в notifier_cs, така и в PubNub API.
И така, обектите, които трябва да бъдат сериализирани, са от клас 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 промени класа на това (забележете публичния метод 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);
и проработи! Получих JSON обекта в канала на PubNub!
{"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();
}
Последния ден си скубя косата. Знам, че тази публикация е супер дълга, но въпреки това оценявам приноса ви.
comma
. След това публикувайте този разделен със запетаи низpubnub.publish("winamp_pipe", "song,title,year");
- person Stephen Blum   schedule 16.09.2012