没有为类型定义序列化程序:System.Windows.Media.Media3D.Point3D

2024-01-15

我正在尝试使用 protobuf 网络序列化一些数据。在序列化过程中,我收到一条错误,指出没有为 Point3D 类型定义序列化。我发现一个类似的问题,但仍然无法实施和解决。链接如下:-没有为类型定义序列化器:System.Drawing.Color https://stackoverflow.com/questions/10966495/no-serializer-defined-for-type-system-drawing-color

[ProtoContract]
public class ReturnPanelData
{
    [ProtoMember(1)]
    public Point3D PlacedPoint3D { get; set; }
    [ProtoMember(2)]
    public double PlacementAngle { get; set; }
    [ProtoMember(3)]
    public string PanelName { get; set; }
}
[ProtoContract]
public class ReturnDataType
{
    [ProtoMember(1)]
    public List<ReturnPanelData> ReturnList { get; set; }
    [ProtoMember(2)]
    public double RemainderArea { get; set; }
    [ProtoMember(3)]
    public int Height { get; set; }
    [ProtoMember(4)]
    public int Width { get; set; }
    [ProtoMember(5)]
    public Point3D BasePoint3D { get; set; }
}
class Program
{
    private static HashSet<ReturnDataType> _processedList = new HashSet<ReturnDataType>();
    static void Main(string[] args)
    {
        using (var file = File.Create(@"D:\SavedPCInfo2.bin"))
        {
            Serializer.Serialize(file, _processedList);
        }
        Console.WriteLine("Done");
    }
}

我是 JSON 序列化/反序列化的初学者。如何解决这个问题?

如果无法使用 Protobuf Net 序列化 Point3D,那么还有哪些其他选项可以序列化/反序列化一个非常大的列表(大约有 300000 个项目)?


首先,protobuf网络 https://github.com/mgravell/protobuf-net不是一个JSON http://json.org/序列化器。它序列化从和到“协议缓冲区” https://www.nuget.org/packages/protobuf-net/- Google 用于大部分数据通信的二进制序列化格式。

话虽这么说,有几种解决方案可以使用 protobuf-net 序列化类型,但不能用ProtoContract属性:

  1. 当被其他类型包含时,请使用代理或“shim”属性,如图所示here https://stackoverflow.com/questions/7046506/can-i-serialize-arbitrary-types-with-protobuf-net, OR
  2. 使用如图所示的代理here https://stackoverflow.com/questions/7046506/can-i-serialize-arbitrary-types-with-protobuf-net, OR
  3. 在运行时教导RuntimeTypeModel https://github.com/mgravell/protobuf-net/blob/master/protobuf-net/Meta/RuntimeTypeModel.cs关于所述类型的所有可序列化字段和属性here http://www.codeproject.com/Articles/642677/Protobuf-net-the-unofficial-manual在该部分不带属性的序列化.

对于选项 2,由于Point3D https://msdn.microsoft.com/en-us/library/system.windows.media.media3d.point3d.aspx完全由其 X、Y 和 Z 坐标定义,引入序列化代理非常容易:

[ProtoContract]
struct Point3DSurrogate
{
    public Point3DSurrogate(double x, double y, double z) : this()
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }

    [ProtoMember(1)]
    public double X { get; set; }
    [ProtoMember(2)]
    public double Y { get; set; }
    [ProtoMember(3)]
    public double Z { get; set; }

    public static implicit operator Point3D(Point3DSurrogate surrogate)
    {
        return new Point3D(surrogate.X, surrogate.Y, surrogate.Z);
    }

    public static implicit operator Point3DSurrogate(Point3D point)
    {
        return new Point3DSurrogate(point.X, point.Y, point.Z);
    }
}

然后在启动时向 protobuf-net 注册一次,如下所示:

ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(Point3D), false).SetSurrogate(typeof(Point3DSurrogate));

或者,对于选项 3,在启动时您可以定义一个合约Point3D像这样:

ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(Point3D), true);
ProtoBuf.Meta.RuntimeTypeModel.Default[typeof(Point3D)].Add(1, "X").Add(2, "Y").Add(3, "Z");

(在我看来,尽管需要更多代码,但代理更清晰;完全在运行时定义协议似乎太繁琐了。)

我不推荐选项 1,因为您需要向所有使用的类添加代理属性Point3D.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有为类型定义序列化程序:System.Windows.Media.Media3D.Point3D 的相关文章

随机推荐

  • 在node-sqlite3中导入CSV文件

    我在我的网络应用程序中使用 npm sqlite3 包来创建一个模拟餐厅 当我的本地服务器启动时 我正在创建一个menuItems table var db new sqlite3 Database memory db serialize
  • Angular 2获取路线没有路线提供者

    在 Angular 2 中我希望能够使用route path 获取路径 在组件构造函数内我有 constructor private route Route 所以我希望能够致电 this route path 对于应用程序引导我得到 boo
  • std::any 跨越 mingw 中的共享库边界

    我在跨共享库边界使用 mingw 的 libstdc 的 std any 实现时偶然发现了一个问题 它产生一个std bad any cast显然不应该 我相信 我使用 mingw w64 gcc 7 并使用 std c 1z 编译代码 简
  • WCF 分块/流式传输

    我正在使用 WCF 想要将一个大文件从客户端上传到服务器 我已经调查并决定遵循以下概述的分块方法http msdn microsoft com en us library aa717050 aspx http msdn microsoft
  • HTML 隐藏控件有任何事件吗?比如onchange之类的?

    我可以将任何事件处理程序附加到 HTML 隐藏输入字段吗 基本上我想在隐藏输入字段值更改时运行一个函数 仅当用户在浏览器中执行事件时才会触发事件 因此如果
  • onclick="parent.location 在 Firefox 和 Chrome 中不起作用

    a a table class SectionHeader1 tbody tr td Customer Information td tr tbody table table class TheBox align center tbody
  • 无法使用反射和 .NET 5 顶级调用找到 Main 方法

    var pt Type GetType
  • 时间范围内的“一对多”关系完整性问题

    假设我有这样的表 CREATE TABLE foo id SERIAL PRIMARY KEY barid integer NOT NULL REFERENCES bar id bazid integer NOT NULL REFERENC
  • 为什么 CPU 上的 Keras LSTM 比 GPU 上快三倍?

    I use 这本来自 Kaggle 的笔记本 https www kaggle com sbongo for beginners tackling toxic using keras运行 LSTM 神经网络 我已经开始训练神经网络 我发现它
  • 注册令牌不是有效的 FCM 注册令牌

    我正在尝试使用从 Android 设备的 PassWallet 应用程序中保存的票证中获取的令牌向我的设备发送消息 该设备使用苹果钱包规范发 送更新通行证所需的所有信息 但是 我使用 FCM 发送通知 但收到此错误 注册令牌不是有效的 FC
  • Windows:如何将驱动器符号链接到另一个驱动器?

    我有一个客户 其数据已从 H 驱动器移至 I 驱动器 但他们的 Access 导出脚本似乎已将 H 驱动器硬编码为目标 即使它不再存在于新系统上 如何创建映射到 I 驱动器的 H 驱动器 我是一个 unix linux 人 我猜是这样的mk
  • 在.NET Core中编译Sass文件

    我正在尝试将 Sass 文件添加到 Visual Studio 2017 中的 NET Core 应用程序中 但是 在创建 scss 文件后 我找不到任何方法来编译它们 我筛选了 NPM 和 Bower 但都没有提供对 Sass 的支持 添
  • 如何在 Visual Studio 中禁用自动插入的“内联”关键字?

    我喜欢移动定义位置Visual Studio 2015 的重构功能除了一件事之外 它会自动插入inline关键字位于函数定义之前 所以我总是不得不自己删除它们 是这样的 重构之前 class GameLoop public void dra
  • 如何从 highstock 图表中提取数据

    假设我有一个示例 highstock 图表 例如this http www highcharts com stock demo basic line在网站中 我想知道是否可以单独从图表中提取数据 即图表是由第三人创建的 并且其他人无法访问图
  • python cdll找不到模块

    我有一个由两个 dll 文件和一个 python 包装器组成的库 我目前的代码基于这三个文件 它们与我的主 python 文件位于同一父目录中 我现在尝试在继续开发之前重构一些东西 并希望将所述库代码移动到它自己的 lib 目录中 不幸的是
  • PowerShell 中从第一个到倒数第二个的数组索引

    如何获取从第一个到倒数第二个的数组元素范围 例如 array 1 2 3 4 5 array 0 will give me the first 1 array 2 will give me the second last 4 array 0
  • Windows Phone 7 SQL Server CE 行版本

    我在 Windows Phone 7 上的 SQL Server CE 中更新表时遇到问题 当我调用提交更改时 应用程序将关闭 没有任何异常或错误 Visual Studio 甚至仍在运行 删除rowversion专栏解决了这个问题 我环顾
  • 使用 ng-switch 时如何防止控制器重新加载

    在此示例中 使用 ng switch 我可以在不同视图之间切换 每个视图都分配有一个控制器 我在网上放了一个快速示例 http jsfiddle net FBHjZ 1 http jsfiddle net FBHjZ 1 看起来每次我切换视
  • ASP.NET MVC 项目和 App_Code 文件夹

    为什么 VS 解决方案资源管理器的 添加 ASP NET 文件夹 子菜单中没有选择 App Code 我知道您可以通过重命名新文件夹来手动创建一个新文件夹 但这里的理由是什么 这不是你应该放置 实用程序 或 服务层 类型类的地方吗 关于 M
  • 没有为类型定义序列化程序:System.Windows.Media.Media3D.Point3D

    我正在尝试使用 protobuf 网络序列化一些数据 在序列化过程中 我收到一条错误 指出没有为 Point3D 类型定义序列化 我发现一个类似的问题 但仍然无法实施和解决 链接如下 没有为类型定义序列化器 System Drawing C