Google.Protobuff timestamp.proto 在 C# 中
Google.Protobuff timestamp.proto in c#
我已经使用 google.proto.Timestamp 成功编译了我的 .proto 文件并使用 protoc 生成了 .cs 文件。我遇到的唯一问题是在我的 C# 代码中进行初始化。
我尝试了以下方法:
.proto 文件
message teststamp
{
string Name = 1 ;
string address = 2;
google.protobuf.Timestamp _timeStamp = 3;
}
C# 文件
teststamp test = new teststamp();
test.Name = "Test";
test.address = "Test_Test_TEST"
//Example 2 : POSIX
test._timeStamp.Seconds = DateTime.Now.Second;
test._timeStamp.Nanos = DateTime.Now.Second*1000 ;
上面的编译没有错误,但给我这个错误:Object reference not set to an instance of an object
。我尝试了其他几种方法,但由于帮助较少,无法修复错误。
请帮我解决这个问题
谢谢
时间戳是 class 所以你必须先像这样创建它:
test._timeStamp = new Timestamp() { Seconds = DateTime.Now.Second }
万一有人无意中发现这个post。
这是一个代码示例:
var unixTimeMS = DateTimeOffset
.UtcNow
.ToUnixTimeMilliseconds();
var seconds = unixTimeMS / 1000;
var nanos = (int)((unixTimeMS % 1000) * 1e6);
var lul = new ProtoModel
{
Timestamp = new Google.Protobuf.WellKnownTypes.Timestamp()
{
Seconds = seconds,
Nanos = nanos
}
};
var unixTimeMSBack = lul.Timestamp
.ToDateTimeOffset()
.ToUnixTimeMilliseconds();
大多数人可能只想使用辅助方法:
using Google.Protobuf.WellKnownTypes;
var timestamp = Timestamp.FromDateTime(DateTime.UtcNow)
任何人的完整示例。
更多信息 Official documentation about Google.Protobuf.WellKnownTypes.Timestamp
原型
syntax = "proto3";
option csharp_namespace = "Test";
import "google/protobuf/timestamp.proto";
package OnlineGrpc;
service OnlineGrpcService {
rpc SendMessage(SendMessageRequest) returns (SendMessageResponse);
}
message SendMessageRequest{
google.protobuf.Timestamp requestDate = 1;
}
message SendMessageResponse{
google.protobuf.Timestamp responseDate = 1;
}
C#发送请求
var request = new SendMessageRequest();
request.requestDate = DateTime.Now.ToTimestamp();
request.requestDate = DateTimeOffset.Now.ToTimestamp();
C# 读取响应
var response = new SendMessageResponse();
DateTimeOffset dateOffset = response.responseDate.ToDateTimeOffset();
DateTime date = response.responseDate.ToDateTime();
这是我将现有 DateTime 实例转换为时间戳的尝试:
// doc.CreateOn is a DateTime
Timestamp.FromDateTime(DateTime.SpecifyKind(doc.CreatedOn, DateTimeKind.Utc));
我已经使用 google.proto.Timestamp 成功编译了我的 .proto 文件并使用 protoc 生成了 .cs 文件。我遇到的唯一问题是在我的 C# 代码中进行初始化。
我尝试了以下方法:
.proto 文件
message teststamp
{
string Name = 1 ;
string address = 2;
google.protobuf.Timestamp _timeStamp = 3;
}
C# 文件
teststamp test = new teststamp();
test.Name = "Test";
test.address = "Test_Test_TEST"
//Example 2 : POSIX
test._timeStamp.Seconds = DateTime.Now.Second;
test._timeStamp.Nanos = DateTime.Now.Second*1000 ;
上面的编译没有错误,但给我这个错误:Object reference not set to an instance of an object
。我尝试了其他几种方法,但由于帮助较少,无法修复错误。
请帮我解决这个问题
谢谢
时间戳是 class 所以你必须先像这样创建它:
test._timeStamp = new Timestamp() { Seconds = DateTime.Now.Second }
万一有人无意中发现这个post。
这是一个代码示例:
var unixTimeMS = DateTimeOffset
.UtcNow
.ToUnixTimeMilliseconds();
var seconds = unixTimeMS / 1000;
var nanos = (int)((unixTimeMS % 1000) * 1e6);
var lul = new ProtoModel
{
Timestamp = new Google.Protobuf.WellKnownTypes.Timestamp()
{
Seconds = seconds,
Nanos = nanos
}
};
var unixTimeMSBack = lul.Timestamp
.ToDateTimeOffset()
.ToUnixTimeMilliseconds();
大多数人可能只想使用辅助方法:
using Google.Protobuf.WellKnownTypes;
var timestamp = Timestamp.FromDateTime(DateTime.UtcNow)
任何人的完整示例。 更多信息 Official documentation about Google.Protobuf.WellKnownTypes.Timestamp
原型
syntax = "proto3";
option csharp_namespace = "Test";
import "google/protobuf/timestamp.proto";
package OnlineGrpc;
service OnlineGrpcService {
rpc SendMessage(SendMessageRequest) returns (SendMessageResponse);
}
message SendMessageRequest{
google.protobuf.Timestamp requestDate = 1;
}
message SendMessageResponse{
google.protobuf.Timestamp responseDate = 1;
}
C#发送请求
var request = new SendMessageRequest();
request.requestDate = DateTime.Now.ToTimestamp();
request.requestDate = DateTimeOffset.Now.ToTimestamp();
C# 读取响应
var response = new SendMessageResponse();
DateTimeOffset dateOffset = response.responseDate.ToDateTimeOffset();
DateTime date = response.responseDate.ToDateTime();
这是我将现有 DateTime 实例转换为时间戳的尝试:
// doc.CreateOn is a DateTime
Timestamp.FromDateTime(DateTime.SpecifyKind(doc.CreatedOn, DateTimeKind.Utc));