小编Lee*_*e F的帖子

使用Dictionary的Protobuf-net对象引用反序列化:引用跟踪对象在反序列化期间更改了引用

我在尝试使用protobuf-net序列化/反序列化复杂对象图时遇到了一些问题.

我正在研究遗留应用程序,我们正在使用.Net Remoting将GUI客户端连接到C#服务.由于使用默认值的对象图的序列化大小,我们看到海外用户的性能不佳BinaryFormatter,客户端和服务器之间的有限带宽(1Mbit/s)加剧了这种情况.

作为一个快速的胜利,我想我已经汇总了一个概念证明,通过实施,使用protobuf-net代替是否有任何性能提升ISerializable.在测试时,我遇到了一个问题,即没有维护对象引用.

我汇总了一个重新解决问题的例子.我期待Dictionary(Items [1])和对象BA中的对象与我AsReference=trueProtoMember属性中指定的对象相同 .

使用protobuf-net 2.0.0.619,我看到反序列化时引发的异常(反序列化过程中引用跟踪对象更改了引用).

如果这不是支持的方案,请告诉我.

测试

[Test]
public void AreObjectReferencesSameAfterDeserialization()
{
    A a = new A();
    B b = new B();

    b.A = a;

    b.Items.Add(1, a);

    Assert.AreSame(a, b.A);
    Assert.AreSame(b.A, b.Items[1]);

    B deserializedB;

    using (var stream = new MemoryStream())
    {
        Serializer.Serialize(stream, b);
        stream.Seek(0, SeekOrigin.Begin);
        deserializedB = Serializer.Deserialize<B>(stream);
    }

    Assert.AreSame(deserializedB.A, deserializedB.Items[1]);
}
Run Code Online (Sandbox Code Playgroud)

类定义

[Serializable]
[ProtoContract]
public class A
{
}

[Serializable]
[ProtoContract]
public class B …
Run Code Online (Sandbox Code Playgroud)

c# serialization protobuf-net

9
推荐指数
1
解决办法
3732
查看次数

如何在Rx中交替缓冲和流动实时数据流

我有两个流.一个是数据流(可以是任何类型),另一个是充当门的布尔流.我需要将这些组合成一个具有以下行为的流:

  • 当门打开(最近的值为真)时,数据应该直接流过
  • 当门关闭(最近的值为假)时,应该缓冲数据以在下一次打开门时作为单独的元素释放
  • 解决方案应保留数据的所有元素并保留顺序

我不太确定如何将它们放在一起.我一直在测试的输入是这样的:

// a demo data stream that emits every second
var dataStream = Observable.Interval(TimeSpan.FromSeconds(1));

// a demo flag stream that toggles every 5 seconds
var toggle = false;
var gateStream = Observable.Interval(TimeSpan.FromSeconds(5))
    .Select(_ => toggle = !toggle);
Run Code Online (Sandbox Code Playgroud)

c# system.reactive

9
推荐指数
1
解决办法
878
查看次数

CommandManager的WPF性能问题

我们从头开始创建了一个新的,相当复杂的WPF应用程序,并且随着CommandManager注册的命令数量的增加而遇到性能问题.我们在MVVM实现中使用简单的轻量级命令,但是我们正在使用的第三方控件(Infragistics)没有,并且自由地调用CommandManager.RegisterClassCommandBinding来添加RoutedCommands.性能问题表现为在响应用户输入时UI中的感觉迟缓,例如控件之间的标签缓慢,文本输入是"生涩"而弹出动画是"笨重的".当应用程序第一次启动时,UI很快.随着更多包含Infragistics网格的屏幕打开,性能会下降.

在内部,CommandManager有一个名为_requerySuggestedHandlers的私有字段,它是List <WeakReference>.我用反射来获取对这个集合的引用,我注意到当我调用.Clear()时,UI的响应性会提升回初始状态.显然我不想去清理那些我知之甚少的收藏品,特别是使用反射(!),但我这样做是为了看看它是否能解决性能问题,并且瞧它了.

通常情况下,这种情况会在经过一段时间后自行清理.但是,WeakReferences(_requerySuggestedHandlers)的集合只会在启动垃圾收集后进行修剪,这是不确定的.因此,当我们关闭包含网格的窗口(Infragistics XamDataGrid)时,在窗口关闭很久之后,"死"网格命令的CanExecute属性将继续被不必要地评估.这也意味着如果我们关闭了许多窗口,性能仍然缓慢,直到启动垃圾收集.我知道这可能发生在分配上,而且我已经看到了自己,因为如果我打开另一个窗口,这会导致初始内存(来自处置的Windows)被收集并且性能恢复正常.

所以,鉴于上述情况,以下是我的问题:

  1. 如何以及从哪里调用CommandManager.InvalidateRequerySuggested()?我没有在MSDN上找到任何文档,可以解释这一点.我连接到CommandManager.RequerySuggested事件,看起来只要控件失去焦点就会调用它.
  2. 是否可以抑制为响应用户输入而调用CommandManager.InvalidateRequerySuggested()?
  3. 有没有其他人遇到这个问题,如果是这样,你怎么避免它?

谢谢!

wpf binding wpf-controls

8
推荐指数
1
解决办法
856
查看次数

当属性值在短窗口内多次更改时,DataTrigger不会触发

我在我的WPF应用程序中发现了一个与MultiDataTrigger相关的一个有趣的问题,它没有启动StoryBoard来为数据网格单元设置动画.我有一个WPF数据网格控件绑定到包含实现INotifyPropertyChanged的POCO的ObservableCollection.

我想要实现的目标

一个实时数据网格,随着值的变化闪烁更新.当值增加时,我希望单元格闪烁绿色; 当值减小时,我希望单元格闪烁红色.动画仅在1秒间隔内将单元格的背景颜色从纯色动画显示为透明.

问题

第一次使用后,MultiDataTrigger不会启动故事板.MultiDataTrigger正在监视对两个属性的更改:IsPositive和HasValueChanged.最初HasValueChanged为false,稍后在设置Value属性后将false从false更改为true,并且动画第一次起作用.此后,HasValueChanged从false变为true以触发更改通知,但动画未启动.

这是我正在应用于每个数据网格单元的XAML样式:

<Style TargetType="{x:Type TextBlock}">
    <Style.Setters>
        <Setter Property="Background"
                Value="Aqua" />
    </Style.Setters>
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=HasValueChanged}"
                            Value="True" />
                <Condition Binding="{Binding Path=IsPositive}"
                            Value="True" />
            </MultiDataTrigger.Conditions>
            <MultiDataTrigger.EnterActions>
                <RemoveStoryboard BeginStoryboardName="PositiveValueCellStoryboard" />
                <RemoveStoryboard BeginStoryboardName="NegativeValueCellStoryboard" />
                <BeginStoryboard Name="PositiveValueCellStoryboard"
                                    Storyboard="{StaticResource PositiveValueCellAnimation}"
                                    HandoffBehavior="SnapShotAndReplace" />
            </MultiDataTrigger.EnterActions>
        </MultiDataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=HasValueChanged}"
                            Value="True" />
                <Condition Binding="{Binding Path=IsPositive}"
                            Value="False" />
            </MultiDataTrigger.Conditions>
            <MultiDataTrigger.EnterActions>
                <RemoveStoryboard BeginStoryboardName="PositiveValueCellStoryboard" />
                <RemoveStoryboard BeginStoryboardName="NegativeValueCellStoryboard" />
                <BeginStoryboard Name="NegativeValueCellStoryboard"
                                    Storyboard="{StaticResource NegativeValueCellAnimation}"
                                    HandoffBehavior="SnapShotAndReplace" />
            </MultiDataTrigger.EnterActions>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

这是动画的XAML:

<Storyboard x:Key="NegativeValueCellAnimation">
    <ColorAnimation Storyboard.TargetProperty="Background.(SolidColorBrush.Color)" …
Run Code Online (Sandbox Code Playgroud)

c# wpf animation xaml datatrigger

6
推荐指数
1
解决办法
2329
查看次数