- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我用这段代码序列化了一个对象
public void play(string url, string i)
{
MP3StreamingPanel mp3=new MP3StreamingPanel ( );
mp3.play ( url );
HttpContext . Current . Session [ i ] = mp3;
然后当我想获取它时,mp3 属性中的某些值仍然为“null”
MP3StreamingPanel mp3=new MP3StreamingPanel ( );
mp3 = HttpContext . Current . Session [ i ] as MP3StreamingPanel;
这是 MP3StreamingPanel 类
[Serializable]
public class MP3StreamingPanel
{
enum StreamingPlaybackState
{
Stopped ,
Playing ,
Buffering ,
Paused
}
[NonSerialized]
public HttpWebRequest webRequest;
[NonSerialized]
public System.Timers.Timer timer1 = new System . Timers . Timer ( );
public SerializableVolumeWaveProvider16 volumeProvider;
delegate void ShowErrorDelegate ( string message );
public string gurl="";
public SerializableBufferedWaveProvider bufferedWaveProvider;
public SerializableWaveOut waveOut;
private volatile StreamingPlaybackState playbackState;
public volatile bool fullyDownloaded;
public MP3StreamingPanel ( )
{
}
public void InitTimer ( )
{
timer1 . Elapsed += new ElapsedEventHandler ( timer1_Tick );
timer1 . Interval = 250; // in miliseconds
timer1 . Start ( );
}
public void timer1_Tick ( object sender , ElapsedEventArgs e )
{
if ( playbackState != StreamingPlaybackState . Stopped )
{
if ( this . waveOut == null && this . bufferedWaveProvider != null )
{
Debug . WriteLine ( "Creating WaveOut Device" );
this . waveOut = CreateWaveOut ( );
waveOut . PlaybackStopped += waveOut_PlaybackStopped;
this . volumeProvider = new SerializableVolumeWaveProvider16 ( `enter code here`bufferedWaveProvider );
waveOut . Init ( volumeProvider );
}
else if ( bufferedWaveProvider != null )
{
var bufferedSeconds = bufferedWaveProvider . BufferedDuration . TotalSeconds;
if ( bufferedSeconds < 0.5 && this . playbackState == StreamingPlaybackState . Playing && !this . fullyDownloaded )
{
this . playbackState = StreamingPlaybackState . Buffering;
waveOut . Pause ( );
Debug . WriteLine ( String . Format ( "Paused to buffer, waveOut.PlaybackState={0}" , waveOut . PlaybackState ) );
}
else if ( bufferedSeconds > 4 && this . playbackState == StreamingPlaybackState . Buffering )
{
waveOut . Play ( );
Debug . WriteLine ( String . Format ( "Started playing, waveOut.PlaybackState={0}" , waveOut . PlaybackState ) );
this . playbackState = StreamingPlaybackState . Playing;
}
else if ( this . fullyDownloaded && bufferedSeconds == 0 )
{
Debug . WriteLine ( "Reached end of stream" );
stop ( );
}
}
}
}
public void StreamMP3 ( object state )
{
this . fullyDownloaded = false;
string url = ( string ) state;
webRequest = ( HttpWebRequest ) WebRequest . Create ( url );
HttpWebResponse resp = null;
try
{
resp = ( HttpWebResponse ) webRequest . GetResponse ( );
}
catch ( WebException e )
{
if ( e . Status != WebExceptionStatus . RequestCanceled )
{
Console.WriteLine ( e . Message );
}
return;
}
byte[] buffer = new byte [ 16384 * 4 ];
IMp3FrameDecompressor decompressor = null;
try
{
using ( var responseStream = resp . GetResponseStream ( ) )
{
var readFullyStream = new ReadFullyStream ( responseStream );
do
{
if ( bufferedWaveProvider != null && bufferedWaveProvider . BufferLength - bufferedWaveProvider . BufferedBytes < bufferedWaveProvider . WaveFormat . AverageBytesPerSecond / 4 )
{
Debug . WriteLine ( "Buffer getting full, taking a break" );
Thread . Sleep ( 500 );
}
else
{
Mp3Frame frame = null;
try
{
frame = Mp3Frame . LoadFromStream ( readFullyStream );
}
catch ( EndOfStreamException )
{
this . fullyDownloaded = true;
break;
}
catch ( WebException )
{
break;
}
if ( decompressor == null )
{
WaveFormat waveFormat = new Mp3WaveFormat ( frame . SampleRate , frame . ChannelMode == ChannelMode . Mono ? 1 : 2 , frame . FrameLength , frame . BitRate );
decompressor = new AcmMp3FrameDecompressor ( waveFormat );
this . bufferedWaveProvider = new SerializableBufferedWaveProvider ( decompressor . OutputFormat );
this . bufferedWaveProvider . BufferDuration = TimeSpan . FromSeconds ( 20 ); // allow us to get well ahead of ourselves
}
int decompressed = decompressor . DecompressFrame ( frame , buffer , 0 );
bufferedWaveProvider . AddSamples ( buffer , 0 , decompressed );
}
} while ( playbackState != StreamingPlaybackState . Stopped );
Debug . WriteLine ( "Exiting" );
decompressor . Dispose ( );
}
}
finally
{
if ( decompressor != null )
{
decompressor . Dispose ( );
}
}
}
public void play ( string url )
{
if ( playbackState == StreamingPlaybackState . Stopped )
{
playbackState = StreamingPlaybackState . Buffering;
this . bufferedWaveProvider = null;
ThreadPool . QueueUserWorkItem ( new WaitCallback ( StreamMP3 ) , url );
gurl = url;
InitTimer ( );
timer1 . Enabled = true;
}
else if ( playbackState == StreamingPlaybackState . Paused )
{
playbackState = StreamingPlaybackState . Buffering;
}
}
public void stop ( )
{
if ( playbackState != StreamingPlaybackState . Stopped )
{
if ( !fullyDownloaded )
{
webRequest . Abort ( );
}
this . playbackState = StreamingPlaybackState . Stopped;
if ( waveOut != null )
{
waveOut . Stop ( );
waveOut . Dispose ( );
waveOut = null;
}
timer1 . Enabled = false;
// n.b. streaming thread may not yet have exited
Thread . Sleep ( 500 );
}
}
public SerializableWaveOut CreateWaveOut ( )
{
return new SerializableWaveOut ( );
}
public void pause ( )
{
if ( playbackState == StreamingPlaybackState . Playing || playbackState == StreamingPlaybackState . Buffering )
{
waveOut . Pause ( );
Debug . WriteLine ( String . Format ( "User requested Pause, waveOut.PlaybackState={0}" , waveOut . PlaybackState ) );
playbackState = StreamingPlaybackState . Paused;
}
}
public void buttonStop_Click ( object sender , EventArgs e )
{
stop ( );
}
private void waveOut_PlaybackStopped ( object sender , StoppedEventArgs e )
{
Debug . WriteLine ( "Playback Stopped" );
if ( e . Exception != null )
{
MessageBox . Show ( String . Format ( "Playback Error {0}" , e . Exception . Message ) );
}
}
}
对于 SerializableVolumeWaveProvider16
,SerializableBufferedWaveProvider
和 SerializableWaveOut
是我声明为 [Serializable] 的类但我无法在序列化后获得这些值
最佳答案
您在此处存储在 session 中的对象很复杂,并且有许多移动部分。人们在使用缓存和 session 时犯的主要错误是存储“事件”对象(见鬼,它有计时器、网络请求等)。您应该只存储(在 session 、缓存或文件系统等中)冷硬非事件数据。我强烈建议您创建一个仅包含数据 的单独 DTO 层;例如:
public class Something {
public string Name {get;set;}
public int SomeNumber {get;set;}
public byte[] Blob {get;set;}
// ... more simple data values
}
理想情况下,您会填充存储/检索这种形式的东西;简单、易于理解等。然后根据需要映射到此 DTO 模型和您的实际模型。
实际上,一个更好的主意是使 DTO 不可变;如果您的提供者实际上没有序列化,而是将内容保存在内存中,这将避免并发症。因为否则以下是模棱两可的:
var obj = session[key] as Something;
if(obj != null) {
obj.Name = "new name";
}
使用序列化提供程序,通常不会反射(reflect)该更改,除非最后再次明确存储;使用 内存中 提供程序,所有其他调用者将立即看到它(请记住,用户可以有多个并发请求)。
如果您在使用 session /缓存等时转向基于 DTO 的模型,您将被迫编写可理解且明显正确的代码。而不是“有时工作的原因没人能猜到”。
关于c# - 我对 session 状态序列化有疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15680728/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!