Hi Feng Xiao,
Thanks for your reply!
Unfortunately I couldn't find good examples how to use it, so let me ask
one more question:
Should I put mask as a part of original message:
message RepAndOpt
{
repeated string name = 1;
string surname = 2;
google.protobuf.FieldMask field_mask = 3;
}
or put it as standalone message?
message RepAndOptMask
{
google.protobuf.FieldMask field_mask = 1;
}
I think there is nothing wrong if I will send them separately, right?
понедельник, 16 мая 2016 г., 22:14:33 UTC+2 пользователь Feng Xiao написал:
>
>
>
> On Wed, May 11, 2016 at 5:09 AM, Denis Bakhvalov <[email protected]
> <javascript:>> wrote:
>
>> Hi,
>>
>> Suppose I have such message structure:
>>
>>
>> package msg_RepAndOpt;
>>
>> message RepAndOpt{
>> repeated string name = 1;
>> optional string surname = 2;
>> ...
>> // there are lots of others.}
>>
>>
>> And I have two components that have copies of this message:
>>
>>
>> // component1:RepAndOpt A;
>> A.add_name("Name");
>> A.set_surname("Surname");
>> // component2:RepAndOpt B;
>>
>>
>> In my case components modify those messages via transaction mechanism. It
>> means that if one component changes some field it also sends it to another
>> component to propagate those changes. Component-receiver is doing merge:
>>
>>
>> // Component2 modifies B and sends it to component1.// Component1 perfoms
>> merge:
>> A.MergeFrom(B);
>>
>>
>> Now, say, component2 wants to erase field "name". If it will send clear B
>> message (default construction) than:
>>
>> - - MergeFrom() will not modify A;
>> - - CopyFrom() will erase also other fields.
>>
>> Another way will be to fill B with the contents of A, clear name field
>> and component1 will use CopyFrom(). But this is not acceptable because
>> system is really high-loaded and there could be lots of other fields. So,
>> desired solution to clean name field is:
>>
>> 1. 1. Component2 create B message.
>> 2. 2. Explicitly stores information that it want to erase only name
>> field.
>> 3. 3. Component1 perform A.MergeFrom(B).
>> 4. 4. Result: A::name is cleared but other fields are left untouched.
>>
>> As far as I tested this applies to repeated and optional fields. Is there
>> any ready-to-use solution or I should modify protobuf implementation?
>>
> I think you can do this using FieldMaskUtil:
>
> https://github.com/google/protobuf/blob/beta-3/src/google/protobuf/util/field_mask_util.h#L111
>
> You create an empty B message along with a FieldMask containing only the
> field you want to clear, and use FieldMaskUtil::MergeMessageTo(A,
> field_mask, &B) to replace the field in A with the value from B.
>
>
>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Protocol Buffers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/protobuf.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.