Кодът за сериализиране на PubNub JSON работи в примерен проект, но не и в моя проект

Създавам плъгин на 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();
}

Последния ден си скубя косата. Знам, че тази публикация е супер дълга, но въпреки това оценявам приноса ви.


person pilau    schedule 15.09.2012    source източник
comment
Редактирах ти заглавието. Моля, вижте Трябва ли въпросите да включват „тагове“ в заглавията си?, където консенсусът е „не“, не трябва.   -  person John Saunders    schedule 15.09.2012
comment
Благодаря Джон. Ще го имам предвид!   -  person pilau    schedule 15.09.2012
comment
Здравей Пилау! Преглеждам данните ви сега.   -  person Stephen Blum    schedule 16.09.2012
comment
За да започнете бързо по работен път, можете да поставите масив от низови стойности в списък, след което да се присъедините към списъка с , comma. След това публикувайте този разделен със запетаи низ pubnub.publish("winamp_pipe", "song,title,year");   -  person Stephen Blum    schedule 16.09.2012
comment
Добавен отговор - вижте Данни за публикуване: PubNub и C# Winamp Song Class   -  person Stephen Blum    schedule 16.09.2012


Отговори (2)


Данни за публикуване: PubNub и C# Winamp Song Class

Вече имате данните, съхранени в екземпляр на 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 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 плъгин.

person Stephen Blum    schedule 15.09.2012
comment
Защо членовете на оригиналния клас не могат да се сериализират? - person pilau; 16.09.2012
comment
Все още се надявам да получа отговор :) - person pilau; 17.09.2012

Е, моето „решение“, тъй като използвам само един клас (класът Song, дефиниран в библиотеката на Sharpamp), за да публикувам стойности, е ръчно конструиране на 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 структурата във вашите данни).

Не маркирам това като отговор, защото не е решение на истинския проблем, а само временно решение...

person pilau    schedule 18.09.2012
comment
Защо избягвате JSON? Защо просто не предавате JSON обект? - person Craig Conover; 17.12.2015