【发布时间】:2021-07-29 16:50:36
【问题描述】:
只是想分享一个关于 protobuf-net 的 R561 版本的观察。使用DateTimeOffSet时出现异常
InvalidOperationException(没有为类型定义序列化程序: System.DateTimeOffset)
出现:
我添加了一个带有getProto() 和StreamWriter 的方法来编写一个原始文件,现在它可以工作了!(并且原始文件也完全可用)。但是如果我评论这个方法,就会发生同样的异常。我真的不明白。
希望这个观察有用。
我会尽量说得更清楚。我有一个 C# 客户端,其中包含一些使用 DateTimeOffset 参数的对象。我用 protobuf-net (r561) 对它们进行了序列化,并添加了一个 writeProtoFile() 方法来使用 getProto() 方法编写一个 proto 文件。序列化似乎工作得很好,原始文件也可以。所以因为我现在有我的 proto 文件,我可以评论或禁止 writeProtoFile() 方法:我不需要其他 proto 文件。所以这是我的第一个问题:
-> 为什么当这个方法(只是写一个调用 getProto() 方法的原始文件)被注释或抑制时,序列化不再起作用?这是我得到的例外:
没有为类型定义序列化程序:System.DateTimeOffset。
当我取消注释 writeProtoFile() 注释时,它可以工作。方法如下:
public static void writeProtoFile(String proto)
{
StreamWriter file = new StreamWriter("c:\\MyprotoFiles\\MyProtoFile.proto");
file.Write(proto);
file.Close();
}
我需要这个对象被 java 客户端使用。用proto编译器生成的java类好像没问题,但是反序列化的时候出现异常:
com.google.protobuf.InvalidProtocolBufferException:解析协议消息时,输入意外在字段中间结束。这可能意味着输入被截断或嵌入的消息误报了自己的长度。
我认为,原因是生成的 DateTimeOffset 类(在原型中,dateTimeOffset 不包含任何内容)
message DateTimeOffset {
}
Java 中存在 DateTimeOffset 类型,所以这是我的第二个问题:-> 有什么方法可以将 C# 中的 dateTimeOffset 参数序列化,然后在反序列化后成为 java 中的 dateTimeOffset 参数?
【问题讨论】:
-
例外很简单:确实,我没有添加对此的支持。我不明白你的最后一段
-
你能澄清一下这里是否有问题吗?否则我应该将其关闭为“不是一个真正的问题”......
标签: c# protobuf-net datetimeoffset